1:ucos任务的组成
A:任务处理函数
B: 任务堆栈
C:任务控制块
其可以使用下面的图来表示任务的构成,
PC的值总是带药执行的指令的地址,反映了一个程序的运行进度。
具有私有空间的任务叫进程,没有私有空间的任务叫:线程,ucos中的所有任务都是线程。
ucos中使用任务链表来记录系统的创建的任务,其结构如下:
2:ucos中线程的结构
main是一个程序的入口,而ucos中的任务什么时间运行,合适中断是由ucos中的任务调度程序来完成。ucos应用程序的通用结构如下:
其中OSTaskCreate()用来创建ucos中的线程,OSStart()用来启动线程,现在启动之后,线程的调度由操作系统来完成。
3:ucos中的优先级
在系统当有多个并发任务需要同时运行的时候,操作系统必须从并发的多个任务中选取一个运行,在ucos中,使用优先级的方式,即对通过OSTaskCreate()创建的每一个task分配一个唯一的优先级来标识任务的重要程度。现在ucso中支持256的任务,ucos中任务的优先级用一个数据来标识,数字越小表示任务的优先级越高。系统通过
#define OS_LOWEST_PRIO 31 /* Defines the lowest priority that can be assigned ... */定义最小优先级。
#define OS_MAX_TASKS 20 /* Max. number of tasks in your application, MUST be >= 2 */定义了系统最多任务的个数。
4:ucos任务堆栈
所谓堆栈就是在寄存器中按照数据的“后进先出”的原则组织的连续存储空间。用来在任务进行切换或者中断的时候保存CPU寄存器中的内容。ucso中每一个任务的任务控制块中都有一个指向其任务堆栈的指针。
ucso中定义了宏变量
typedef unsigned int OS_STK; /* Each stack entry is 32-bit wide */
比如一个任务为自己定义的堆栈大小为:static OS_STK TcpServerStack[TCPMULTISERVER_STK_SIZE];
此处定义的任务堆栈数据将传入OSTaskCreate()函数中,需要注意不同的CPU有不同栈增长方式。
增长方式的不同任务函数的创建的时候也不同。
在任务创建函数OSTaskCreate()中的OSTaskStkInit()函数来初始化任务的堆栈,此函数将任务处理函数的指针放入到PC寄存器。
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
(void)opt; /* 'opt' is not used, prevent warning */
stk = ptos; /* Load stack pointer */
/* Registers stacked as if auto-saved on exception */
*(stk) = (INT32U)0x01000000L; /* xPSR */
*(--stk) = (INT32U)task; /* Entry Point PC */
*(--stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used)*/
*(--stk) = (INT32U)0x12121212L; /* R12 */
*(--stk) = (INT32U)0x03030303L; /* R3 */
*(--stk) = (INT32U)0x02020202L; /* R2 */
*(--stk) = (INT32U)0x01010101L; /* R1 */
*(--stk) = (INT32U)p_arg; /* R0 : argument */
/* Remaining registers saved on process stack */
*(--stk) = (INT32U)0x11111111L; /* R11 */
*(--stk) = (INT32U)0x10101010L; /* R10 */
*(--stk) = (INT32U)0x09090909L; /* R9 */
*(--stk) = (INT32U)0x08080808L; /* R8 */
*(--stk) = (INT32U)0x07070707L; /* R7 */
*(--stk) = (INT32U)0x06060606L; /* R6 */
*(--stk) = (INT32U)0x05050505L; /* R5 */
*(--stk) = (INT32U)0x04040404L; /* R4 */
return (stk);
}
函数体体与下面的寄存器对应。
ucos 任务的基本概念
最新推荐文章于 2024-03-03 11:10:29 发布