UCOS是一种典型的MCU操作系统。在以前的工作中用到过,相比于裸机,使用操作系统可以更好的利用MCU的资源并简化开发。最近有人在问,于是就写个博客,做下简单的介绍。本文的硬件环境是stm32f103c8t6。
概览
下面的代码展示了一个UCOS程序,功能为GPIOC13口驱动LED闪烁。
直接上代码:
文件:app.c
#include <includes.h>
//任务1
static OS_STK TommyTaskSTK[8];
void GPIO_Configuration(void);
void TommyTask1(void *p_arg);
void Delay(u32 nCount);
//操作系统入口函数
int main (void)
{
INT8U err;
//Set the Vector Table base location at 0x08000000
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
//Initialize "uC/OS-II, The Real-Time Kernel"
OSInit();
//初始化 GPIOC, GPIO_Pin_13
GPIO_Configuration();
//Create the start task
/*创建任务函数
OSTaskCreate(void (*task)(void *p_arg),
void *p_arg,
OS_STK *ptos,
INT8U prio);
*/
//创建任务1
OSTaskCreate(TommyTask1, //任务函数指针
(void*)0, //任务函数参数
(OS_STK *)&TommyTaskSTK[7], //栈顶指针
2); //任务优先级
#if (OS_TASK_NAME_SIZE > 13)
OSTaskNameSet(APP_TASK_START_PRIO, "Start Task", &err);
#endif
OSStart(); /* Start multitasking (i.e. give control to uC/OS-II) */
}
//任务1
void TommyTask1(void *p_arg)
{
for(;;)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13); //Pin13复位
Delay(0xfffff);
GPIO_SetBits(GPIOC, GPIO_Pin_13); //Pin13置位
Delay(0xfffff);
}
}
//初始化GPIOC13
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//简单延时函数
void Delay(u32 nCount)
{
for(; nCount != 0; nCount--);
}
观察上面的代码可以发现,一个最简单UCOS的主函数包括这几个部分:
1.用户变量和函数声明和定义
2.系统初始化
3.外设初始化
4.创建任务
5.启动系统
注意:UCOS至少要有一个任务,否则不能运行。
将上面的代码编译后下载到MCU后,就可以看到Led闪烁。
当有多个任务时,操作系统就会根据优先级和具体的任务状态进行任务切换。