一、概述
目前,各厂家、论坛有各种版本的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,0GPIO_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); //初始化UCOSIIIOS_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); //开启UCOSIIIwhile(1);
}
四、效果展示
五、源码下载
代码地址:Stm32F429+UCOSIII最小系统源码
打字不易,点波关注,评论区留下邮箱,作者无偿提供源码和问题解答。