一共分为三部分:
第一部分:任务创建与删除。重点在于理解任务创建的各个参数即可。
第二部分:任务挂起和恢复。函数比较简单,看看即可。
第三部分:时间片调度
重点在于第三部分代码讲解
- 步骤1:先调用OSTaskCreate创建任务 步骤2:使用OSStart(&err)开启任务
- 切记:在没有使用时间片轮转的时候,任何任务的优先级不能相同
- 任务创建思路,在main中只创建一个start任务,然后在其中创建其他任务
//任务优先级
#define TASK2_TASK_PRIO 4
//任务堆栈大小
#define TASK2_STK_SIZE 128
//任务控制块
OS_TCB Task2_TaskTCB;
//任务堆栈
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
//任务函数
void task2_task(void *p_arg);
CPU_SR_ALLOC();
...
OS_CRITICAL_ENTER(); //进入临界区
//任务创建
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任务控制块
(CPU_CHAR * )"start task", //任务名称
(OS_TASK_PTR )start_task, //任务函数
(void * )0, //任务函数的参数,一般不用,这里直接设置为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, //内建消息队列长度
(OS_TICK )0, //时间片长度(单位时钟节拍)。0:表示为默认值。为OS_CFG_TICK_RATE 200u/10.为20个节拍,也就是100ms
(void * )0, //用户补充的存储区,用于扩展PCB,一般不用。
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //选择检查和清除STK功能(SAVE_FP浮点处理的,不用管,移植的时候已经处理)
(OS_ERR * )&err); //错误信息
OS_CRITICAL_EXIT(); //退出临界区
- 记得在创建任务的时候要进入临界区。并且进入临界区之前,要调用CPU_SR_ALLOC();
- OSTimeDlyHMSM(1h, 1m, 1s, 1ms)//括号内为参数的实际含义
|