UCOSIII_多任务创建(一)

UCOSIII是个多任务操作系统,对任务操作有创建、挂起、删除和调度等。

任务状态有:
休眠态:任务函数只是存储区的一段代码,不受UCOS控制
就绪态:任务在就绪表中已经登记,等待获取CPU使用权
运行态:任务正在运行
等待态:正在运行的任务需要等待某一个事件,像信号量、消息、事件标志组等,这时会暂时让出CPU使用权,进入等待状态
中断服务态:一个正在执行的任务被中断打断,CPU转而去执行中断服务程序,这时这个任务会被挂起,进入中断服务态

任务控制块OS_TCB:用来保存任务的信息,它是个结构体
任务堆栈CPU_STK:用来在切换任务和调用其它函数的时候保存现场,CPU_STK大小是4字节

创建一个任务需要定义控制块StartTaskTCB、优先级START_TASK_PRIO、堆栈START_TASK_STK[START_STK_SIZE]。
创建任务前需要初始化UCOSIII——OSInit(&err); err是接收错误时返回的错误码,用OS_ERR定义。
创建任务用OSTaskCreate(...)实现,创建好的任务直接进入就绪态。

   //任务优先级
#define START_TASK_PRIO     3
//任务堆栈大小    
#define START_STK_SIZE      512
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈  
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);

int main()
{   
    OS_ERR err;
    CPU_SR_ALLOC();

    
    OSInit(&err);       //初始化UCOSIII
    OS_CRITICAL_ENTER();    //进入临界区 
    //创建开始任务
    OSTaskCreate((OS_TCB    * )&StartTaskTCB,       //任务控制块
                 (CPU_CHAR  * )"start task",        //任务名字,自己起的
                 (OS_TASK_PTR )start_task,          //任务函数
                 (void      * )0,                   //传递给任务函数的参数
                 (OS_PRIO     )START_TASK_PRIO,     //任务优先级
                 (CPU_STK   * )&START_TASK_STK[0],  //任务堆栈基地址
                 (CPU_STK_SIZE)START_STK_SIZE/10,   //任务堆栈深度限位
                 (CPU_STK_SIZE)START_STK_SIZE,      //任务堆栈大小
                 (OS_MSG_QTY  )0,                   //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
                 (OS_TICK     )0,                   //当使能时间片轮转时的时间片长度,为0时为默认长度,
                 (void      * )0,                   //用户补充的存储区
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
                 (OS_ERR    * )&err);               //存放该函数错误时的返回值 
    OS_CRITICAL_EXIT(); //退出临界区  
    OSStart(&err);  //开启UCOSIII
}
  • 任务堆栈深度限位是指堆栈剩余量,当剩余量小于或等于该值表明堆栈快要用完,用来检测个确保堆栈不溢出
  • 没有参数传入函数传递给任务函数的参数就是0
  • 优先级数值越低,优先级越高,但不能使用系统任务的优先级()
  • 时间片长度在时间片轮转调度时使用,运行几个时间片就填几
  • OPT选项:
    OS_OPT_TASK_STK_CHK:检测任务堆栈
    OS_OPT_TASK_STK_CLR:清除任务堆栈
    OS_OPT_TASK_NONE:无选项
  • 最后要OSStart(&err); //开启UCOSIII
  • 进出临界区函数范围内的程序不会被打断
  • CPU_SR_ALLOC();是个宏定义了一个变量os_cpu_sr是用来存 cpu 状态寄存器用的,用到临界区这个宏必须声明
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值