分享

ucos 任务的基本概念

 心不留意外尘 2016-05-12

http://blog.csdn.net/suiyuan19840208/article/details/15337949

2013

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);
}
函数体体与下面的寄存器对应。

0

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多