ucos 任务的基本概念

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
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家有工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值