一、概述
目前,各厂家、论坛有各种版本的UCOSIII移植代码,对于初学者来说选择起来比较困难,无法分辨哪些是经过工程验证?是否能够保证长期稳定运行?本文博主有20年工作经验,熟悉嵌入式硬件电路设计、软件编程,熟悉51单片机、AVR单片机、STM32、GD32单片机等,希望将实际项目的编程经验分享给广大嵌入式爱好者。本文主要介绍基于原子阿波罗开发板硬件平台实现的UCOSIII最小系统源代码。
二、硬件平台
原子阿波罗开发板,单片机STM32F429。
三、代码解析
工程介绍
该工程比较简单,主要有STM32内核相关的CORE、应用相关的USER、ST官方HAL库、DSP_LIB库、内存管理MALLOC、硬件驱动HARDWARE、UCOSIII相关文件组成,其中SYSTEM中实现了delay_us、delay_ms函数,为UCOSIII提供嘀嗒时钟。读者需重点关注main.c及led.c两个文件,了解ucosiii系统运行模式。

led.c文件
完成LED硬件初始化。
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB1置1
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB0置1
main.c文件
完成时钟配置,HAL库初始化,延时初始化、LED初始化等,创建Start任务等。
int main(void)
{
OS_ERR err;
CPU_SR_ALLOC();
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
HAL_Init(); //初始化HAL库
delay_init(180); //初始化延时函数
LED_Init(); //初始化LED
my_mem_init(SRAMIN); //初始化内部内存池
OSInit(&err); //初始化UCOSIII
OS_CRITICAL_ENTER(); //进入临界区
//创建开始任务
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任务控制块
(CPU_CHAR * )"start task", //任务名字
(OS_TASK_PTR )start_task, //任务函数
(void * )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, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
(void * )0, //用户补充的存储区
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
(OS_ERR * )&err); //存放该函数错误时的返回值
OS_CRITICAL_EXIT(); //退出临界区
OSStart(&err); //开启UCOSIII
while(1);
}
四、效果展示

五、源码下载
打字不易,点波关注,评论区留下邮箱,作者无偿提供源码和问题解答。