UCOS系统是一个抢占式实习系统内核。
把UCOS系统应用在实际项目当中,首先要建立一个空的系统模版。
我是下的ST官库。
1.我首先把所有任务都删掉。
2.建立2个空的任务static void App_TaskOne(void);static void App_TaskTwo(void);
3.然后在main()函数里建立一个任务。
OSTaskCreate((void (*)(void *)) App_TaskStart, /* Create the start task. */
(void * ) 0,
(OS_STK * )&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],
(INT8U ) 2
);
static void App_TaskStart (void)
{
OS_CPU_SysTickInit(); //系统心跳
OSTaskCreate((void (*)(void *)) App_TaskOne, /* Create the start task. */
(void * ) 0,
(OS_STK * )&App_TaskLCDStk[APP_TASK_START_STK_SIZE - 1],
(INT8U ) 8
);
OSTaskCreate((void (*)(void *)) App_TaskTwo, /* Create the start task. */
(void * ) 0,
(OS_STK * )&App_TaskKbdStk[APP_TASK_START_STK_SIZE - 1],
(INT8U ) 9
);
printf("Creat App_TaskStart!\r\n");
OSTimeDlyHMSM(0,0,0,10);
OSTaskDel(2);
}
编译运行。我发现只运行任务1并没有运行任务2。我在任务1和任务2当中加入函数OSTimeDlyHMSM(0,0,0,10);发现2个函数都能运行了。但我知道这样做并不是正的成功了。
这样一个函数是延长任务的执行。在这个任务的延时中,系统去执行任务2了。所以2个任务都会被运行。
基本思想就是这样。在任务1里没有然后的操作让出CPU。要运行任务2必须让出CPU。就这样我在任务1里加了OSTaskSuspend(8);把任务1挂起。在任务2里OSTaskResume(8);恢复任务2。
编译运行。发现2个任务循环运行。达到我想要的结果。这只是简单的任务。在实际项目当中,还必须考虑到中断,以及数据的共享。
1.中断,当CPU去执行中断函数的时候。必须考虑的关中断和开中断。以及中断里的数据问题。还有就是中断执行完成以后。返回原来的任务还是执行最高的任务。自己必须先弄清楚。按照系统来讲中断执行完成以后,返回之前会判断原来任务还是不是最高优先级。如果不是则执行最高优先级任务。