- 功能描述:
- 两个任务不停运行,flag1,flag2交替翻转,任务结束,切换另一任务;
- 主函数例程代码:
#include "os.h" #include "ARMCM3.h" /* ************************************************************************************************************************ * 全局变量 ************************************************************************************************************************ */ uint32_t flag1; uint32_t flag2; /* ************************************************************************************************************************ * TCB & STACK & 任务声明 ************************************************************************************************************************ */ #define TASK1_STK_SIZE 20 //任务栈大小 #define TASK2_STK_SIZE 20 static CPU_STK Task1Stk[TASK1_STK_SIZE]; //栈存储在数组里,地址自增/减 static CPU_STK Task2Stk[TASK2_STK_SIZE]; static OS_TCB Task1TCB; static OS_TCB Task2TCB; void Task1(void *p_arg); void Task2(void *p_arg); int main(void) { OS_ERR err; OSInit(&err); //初始化相关的全局变量 OSTaskCreate( (OS_TCB *) &Task1TCB, (OS_TASK_PTR) Task1, (void *) 0, (CPU_STK*) &Task1Stk[0], (CPU_STK_SIZE) TASK1_STK_SIZE, (OS_ERR *) &err ); OSTaskCreate( (OS_TCB *) &Task2TCB, (OS_TASK_PTR) Task2, (void *) 0, (CPU_STK*) &Task2Stk[0], (CPU_STK_SIZE) TASK2_STK_SIZE, (OS_ERR *) &err ); OSRdyList[0].HeadPtr = &Task1TCB; OSRdyList[1].HeadPtr = &Task2TCB; OSStrart(&err); //启动OS,无返回值 } void delay(uint32_t count) { for(;count!=0;count--); } void Task1(void *parg) { for(;;) { flag1 = 0; delay(100); flag1 = 1; delay(100); OSSched(); } } void Task2(void *parg) { for(;;) { flag2 = 0; delay(100); flag2 = 1; delay(100); OSSched(); } }
- 实现现象:
- 添加flag1,flag2到逻辑分析中:
- 总结:
- 仿真时应把任务的堆栈、TCB、OSTCBCurPtr、OSTCBHighRdyPtr这些变量都添加到观察窗口,然后单步执行程序,看看这些变量是如何变化的,让机器执行代码的过程在自己的脑子里面过一遍;
- 推荐看“李述铜老师的《自己动手从0到1写嵌入式操作系统》”,思路清晰、过程简洁明了,非常适合想要深入学习RTOS的,附链接:https://edu.csdn.net/course/play/4605/82618?utm_source=blog2edu
【11】从0到1教你写uC/OS-III————>综合例程,任务创建测试
最新推荐文章于 2020-04-17 23:50:28 发布