UCOSIII系统的移植步骤:
1、获取STM32的裸机模板
2、下载UCOS-III源码
3、UCOS-III源码文件简介
4、移植至STM32工程
5、按需配置工程
6、修改app.c
一个简单的多任务程序:
Main.c
int Main(void)
{
TargetInit(); //初始化目标板
OSInit(); //初始化操作系统
OSTaskCreate(Task0,&StackTask0[StackSizeTask0 - 1],PrioTask0); // 创建一个任务
Uart_Printf("Ready to start OS\n");
OSStart(); //运行操作系统
return 0; //程序不会运行至此
}
void Task0(void)
{
TargetStart(); //设置中断向量,启动操作系统的硬件定时器中断
Uart_Printf("Start OS\n");
// 创建其他任务
OSTaskCreate(Task1,&StackTask1[StackSizeTask1 - 1],PrioTask1);
OSTaskCreate(Task2,&StackTask2[StackSizeTask2 - 1],PrioTask2);
OSTaskCreate(Task3,&StackTask3[StackSizeTask2 - 1],PrioTask3);
while(1)
{
Uart_Printf("Task0\n");
OSTimeDly(100); //1 秒运行一次
}
}
void Task1(void)
{
while(1)
{
Uart_Printf("Task1\n");
OSTimeDly(300); //3 秒运行一次
}
}
void Task2(void)
{
while(1)
{
Uart_Printf("Task2\n");
OSTaskSuspend(PrioTask2); // 使自己进入挂起状态
}
}
void Task3(void)
{
while(1)
{
Uart_Printf("Resume Task2\n");
OSTaskResume(PrioTask2); // 恢复任务2
OSTimeDly(800);
}
}
程序中创建了四个任务,任务0 每1 秒运行一次,任务1 每3 秒运行一次,任务2 运 行一次即把自己挂起,任务3每8秒运行一次并把任务2恢复。
程序在终端的运行结果如下:
?
任务的特性:
动态性。任务并不是随时都可以运行的,而一个已经运行的任务并不能保证 一直占有CPU直到运行完。一般有就绪态,运行态,挂起态等。 ????????运行态。一个运行态的任务是一个正在使用CPU的任务。任何时刻有且只有 一个运行着的任务。 ????????就绪态。一个就绪态任务是可运行的,等待占有CPU的任务释放CPU。 ????????挂起态。某些条件不满足而挂起不能运行的状态。
独立性。任务之间互相独立,不存在互相调用的关系。所有任务在逻辑上都 是平等的。由于任务之间互相看不见,所以他们之间的信息传输就无法当面 完成。这就需要各种通信机制如信号量,消息邮箱,队列等来实现。
并发性。由同一个处理器轮换地运行多个程序。或者说是由多个程序轮班地 占用处理器这个资源。且在占用这个资源期间,并不一定能够把程序运行完 毕。
|