ucos

UCOSII之任务堆栈使用情况检查(通过OSTaskStkChk()函数查看)

我的梦境 提交于 2020-01-10 17:21:29
本文重点介绍如果使用函数OSTaskStkChk()函数来检查UCOSII系统下各任务堆栈的使用情况。 1、简单介绍一下OSTaskStkChk()函数参数和返回值: INT8U OSTaskStkChk(INT8U prio, OS_STK_DATA *p_stk_data) 参数prio : 被检测任务的优先级,也就是唯一标识被检任务的ID。 参数*p_stk_data:指向OS_STK_DATA 结构体的一个变量指针。 OS_STK_DATA 结构体如下: typedef struct os_stk_data { INT32U OSFree; /* Number of free entries on the stack */ INT32U OSUsed; /* Number of entries used on the stack */ } OS_STK_DATA; 返回值:0,表示函数返回成功,即:OS_ERR_NONE 异常返回值如下: OS_ERR_PRIO_INVALID :被检测任务的优先级优先级设置错误,可能比最高优先级都高了。要小于最高优先级并大于最低优先级,同时不要和自己检测任务的优先级相同 OS_ERR_TASK_NOT_EXIST :你要检测的任务没有被建立或者被分配到一个互斥PIP OS_ERR_TASK_OPT

Keil uCos 2.52 stm32 【worldsing笔记】

五迷三道 提交于 2019-12-31 19:57:55
1、uCOSii V2.52 a、加了7个可以配置的钩子函数宏 #define OS_TASK_CREATE_HOOK_EN 0 /* 任务创建时调用钩子函数 使能 1 / 禁止 0 */ #define OS_TASK_STAT_HOOK_EN 0 /* 统计任务运行时调用钩子函数 使能 1 / 禁止 0 */ #define OS_TASK_SW_HOOK_EN 1 /* 任务调度时调用钩子函数 使能 1 / 禁止 0 */ #define OS_TIME_TICK_HOOK_EN 1 /* 滴答中断时调用钩子函数 使能 1 / 禁止 0 */ #define OS_TCB_INIT_HOOK_EN 0 /* TCB初始化时调用钩子函数 使能 1 / 禁止 0 */ #define OS_TASK_IDLE_HOOK_EN 0 /* 统计任务运行时调用钩子函数 使能 1 / 禁止 0 */ #define OS_INIT_BEGIN_HOOK_EN 0 /* OS初始化开始时调用钩子函数 使能 1 / 禁止 0 */ #define OS_INIT_END_HOOK_EN 0 /* OS初始化结束时调用钩子函数 使能 1 / 禁止 0 */ b、加了创建任务是自动分配栈接口OSSetupTask和宏,也可以用原生的OSTaskCreate(),OSSetupTask(任务名,

ucosii-2- 5330杨璟旭

老子叫甜甜 提交于 2019-12-29 10:04:21
题目要求 阅读附件中的代码,回答: ucos是如何分层的? HAL都有哪些代码? 分析任务是如何切换的? 1. ucos是如何分层的? 一共四层:硬件相关层,驱动接口层,应用接口层,应用层。好的分层会让软件开发相对独立化,分工同步进行。 所有的硬件被抽象化,应用层的程序,在硬件完全更换的情况下,只要硬件相关层被更新,完全可以等同原先的所实现的功能。这样就极大成度上方便了移植。 硬件相关层: 在这层中,要尽量所有硬件相关都囊括在其中。不管是GPIO还是定时器,或串行接口。只要提供标准统一的接口,就可以让上层会因此而变的很潇洒。这其中有三个最为重要的接口Open,Close,Ctrl。 Open主要来完成对应硬件初始化,形参中包括了些,初始化的相关参数。Close失能硬件。Ctrl来实现一些控制的修改如:优先级,中断回调函数等等,硬件的不同,内容也大为不同。 驱动接口层: 其实在上一层也算是驱动层,只不过因为硬件相关,而把他分离。这层中会用到一个或多个硬件层的接口,进行组合来实现特定功能的程序。这部分程序可举例进行说明。以Flash为列,它这里主要调用硬件层的SPI函数接口,但是主要的写,读指令都是在这里函数中完成的。在这层中需要提供5个标准统一的接口函数: XXXOpen XXXClose XXXWrite XXXRead XXXIoCtl 没有被用到的函数,可以为空

creating task inside other task in freertos

对着背影说爱祢 提交于 2019-12-24 10:54:23
问题 I am an RTOS newbie and I am creating a simple real time system for automotive I am wondering if it possible to create a task inside another task. I tried to do this by the following method but it doesn't work. void vTask1 { *pvParameters){ unsigned portBASE_TYPE taskPriority; taskPriority=uxTaskPriorityGet( NULL ); char x; while (1){ x= 5 ; if (x==5) xTaskCreate( vTask2 , "task2", 1000, "task2 is running", taskPriority+5 , NULL ); } when I debug that code it hangs at xTaskCreate without

手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(四)

假装没事ソ 提交于 2019-12-16 15:04:12
继续...... 再回到那个重要得函数: void OS_Sched (void) { #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0u; #endif OS_ENTER_CRITICAL(); if (OSIntNesting == 0u) { /* Schedule only if all ISRs done and ... */ if (OSLockNesting == 0u) { /* ... scheduler is not locked */ OS_SchedNew(); OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */ #if OS_TASK_PROFILE_EN > 0u OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */ #endif OSCtxSwCtr++; /* Increment context switch

uC/OS-III和FreeRTOS的区别

落花浮王杯 提交于 2019-12-16 07:30:22
在阅读完uC/OS-III(V3.03.01)和FreeRTOS(V10.0.1)的源码后,我对RTOS有了较深的认识。现将它们之间的一些区别总结出来,有利于大家理解这两个RTOS。 1、uCOS-III中所有的内核对象(如任务控制块、消息队列、信号量等)都是静态创建的,需要用户提供。FreeRTOS中的内核对象支持动态和静态两种创建方法。 (PS: 其实系统提不提供动态创建功能并不那么重要,因为在静态创建的方法的基础上加入内存管理机制,就能自已封装实现动态创建函数) 2、uCOS-III中的任务状态较多,因为它存在“基本状态+挂起状态”这类状态,FreeRTOS中挂起态是个单独的状态。在FreeRTOS中,如果suspend一个正在阻塞的任务,API内部会把任务从相应阻塞表中删除,并将其挂在xSuspendedTaskList上,当该任务被resume后,它就是就绪态,而不会重新返回阻塞态。而uCOS-III中的任务即便在阻塞时被suspend了,它依然处于阻塞态(即等待某个事件发生),如果在suspend的过程中事件发生了,它将解除阻塞态,变为纯粹的挂起态;如果在resume后,该事件仍未发生,它将解除挂起态,变为阻塞态。 (PS: 我感觉uCOS-III中的“挂起”更能称之为“挂起”) 3、为了实现中断和任务的同步,需要在中断中进行post操作,uC/OS

How to make my data types independent of compiler in c

被刻印的时光 ゝ 提交于 2019-12-13 05:07:44
问题 I was studying uC/OS and read this article: Because different microprocessors have different word length , the port of μC/OS-II includes a series of type definitions that ensures portability Specifically, μC/OS-II’s code never makes use of C’s short, int and, long data types because they are inherently non-portable. Instead, I defined integer data types that are both portable and intuitive as shown in listing 1.1. Also, for convenience, I have included floating-point data types even though μC

手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(二)

匆匆过客 提交于 2019-12-12 23:35:59
继续...... if (ticks > 0u) { /* 延时参数是否为0 */ OS_ENTER_CRITICAL();            /* 禁止中断 */ y = OSTCBCur->OSTCBY; OSRdyTbl[y] &= (OS_PRIO)~OSTCBCur->OSTCBBitX; if (OSRdyTbl[y] == 0u) { OSRdyGrp &= (OS_PRIO)~OSTCBCur->OSTCBBitY; } OSTCBCur->OSTCBDly = ticks; OS_EXIT_CRITICAL();           /* 开启中断 */ OS_Sched(); } 在上一段代码中,出现了一个陌生的数组: OSRdyTbl[],跟踪这个变量可以找到它的定义,发现它仅仅是一个uint8型的数组,长度是8个。可以明确的告诉大家,这个数组很重要,应该算是任务优先级调度核心参数之一,与下面那个参数OSRdyGrp 合起来便可以作为任务就绪表。 ※接下来需要讲UCOSII系统的任务优先级调度策略,这一段有些复杂,需要反复思考,查阅大量的资料。 UCOSII的优先级策略 UCOSII操作系统最大可以管理64个任务(255个的暂时不讨论),每个任务都有唯一的优先级,从0开始到64,数字越小优先级越高,越优先进行系统调用,为了方面管理和调度

手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(三)

只愿长相守 提交于 2019-12-12 22:56:56
继续...... if (ticks > 0u) { /* 0 means no delay! */ OS_ENTER_CRITICAL(); y = OSTCBCur->OSTCBY; /* Delay current task */ OSRdyTbl[y] &= (OS_PRIO)~OSTCBCur->OSTCBBitX; if (OSRdyTbl[y] == 0u) { OSRdyGrp &= (OS_PRIO)~OSTCBCur->OSTCBBitY; } OSTCBCur->OSTCBDly = ticks; /* Load ticks in TCB */ OS_EXIT_CRITICAL(); OS_Sched(); /* Find next task to run! */ } 依然是这一部分,接下来的重点是这个函数:OS_Sched() 这个函数实在是太重要了,因此我不得不慎重。 首先看一下官方的注释: /********************************************************************************************************* * SCHEDULER * * Description: This function is called by other uC/OS-II

Allocation and Free in Micriμm μC/OS-III RTOS

心不动则不痛 提交于 2019-12-11 03:03:46
问题 We are using the μC/OS-III RTOS of Micrium with a RX62N of Renesas. We built a system where we have to dynamicly alloc and free data. We found out the functions malloc() and free() are not working well with the RTOS. However the RTOS has a custom function for this; the Mem_HeapAlloc() function. This function allocates some memory of the RTOS' made 'heap' . Problem is that it does not have a free function, probably because everything goes into a heap pool . In the RTOS it is also possible to