完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
学习uCOS-III也有段时间了,自己也移植了两遍,为了方便自己查阅,今天将移植的整个过程形成文章。
第一步:移植前的准备 移植工作之前需要准备的东西如下: uCOS-III源代码版本:3.03.01 Keil uVision5软件版本:V5.14 使用学习板处理器:STM32F103ZET 首先需要准备Keil5工程模板,这里使用的是V3.5的标准外设库,因为工作后就没怎么使用过STM32,所以最新的开发环境STM32CubeMX及HAL库均不知为何物;Keil5工程模板参照安富莱的工程模板,因为硬汉做的工程实在是太工整了。 uCOS-III的源代码可以从Micrium官网上下载,下面是基于STM32F107评估板的内核源代码工程结构: 下载到的不是单独的内核源码,uCOS-III的开发人员已经将不同版本的源码移植到了不同处理器的评估板上,这样我们移植起来非常方便,增加开发效率。红色三角标注的为后续移植所使用的文件。 第二步:向Keil5工程模板中添加内核源码文件 将操作系统源码文件放在工程模板下,并添加到Keil5工程中,如下图所示 注意:8个配置文件放在了User文件夹下。 将操作系统源码文件添加到工程后,设置好对应的头文件路径,保证编译无错误。bsp.c文件中有任务率测量初始化函数CPU_TS_TmrInit (void)和任务率测量函数 CPU_TS_TmrRd (void),需要将这两个函数移走,使板级支持包和操作系统内核源码分离开,方便以后统一将写的板级支持包文件放在BSP文件夹下,方便管理。参照官方给出的STM32F4的工程模板,将这两个函数放在了cpu_bsp.c文件中。此时还差一个主函数,main函数如下 /* ************************************************************************************* * * 模块名称 : uCOS-III * 文件名称 : main.c * 版 本 : V0.1 * 说 明 : 本例程主要为uC0S-III移植的工程模板。 * * * 修改记录 : * 版本号 日期 作者 说明 * V0.1 2019-07-30 hlz 1. ST固件库到V3.5版本 * 2. uCOS-III版本V3.03.01 * 3. uC/CPU版本V1.29.01 * 4. uC/LIB版本V1.37.01 * * ************************************************************************************* */ #include “includes.h” /* ************************************************************************************* * 静态全局变量 ************************************************************************************* */ static OS_TCB AppTaskStartTCB; static CPU_STK AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE]; static OS_TCB AppTaskLed1TCB; static CPU_STK AppTaskLed1Stk[APP_TASK_LED1_STK_SIZE]; static OS_TCB AppTaskLed2TCB; static CPU_STK AppTaskLed2Stk[APP_TASK_LED2_STK_SIZE]; /* ************************************************************************************* * 函数声明 ************************************************************************************* */ static void AppTaskStart (void *p_arg); static void AppTaskLed1 (void *p_arg); static void AppTaskLed2 (void *p_arg); ************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口。 * 形 参: 无 * 返 回 值: 无 ************************************************************************************* */ int main(void) { OS_ERR err; CPU_SR_ALLOC(); /* 初始化uC/OS-III 内核 */ OSInit(&err); OS_CRITICAL_ENTER(); /* 创建一个启动任务(也就是主任务)。启动任务会创建所有的应用程序任务 */ OSTaskCreate((OS_TCB *)&AppTaskStartTCB, /* 任务控制块地址 */ (CPU_CHAR *)“App Task Start”, /* 任务名 */ (OS_TASK_PTR )AppTaskStart, /* 启动任务函数地址 */ (void *)0, /* 传递给任务的参数 */ (OS_PRIO )APP_CFG_TASK_START_PRIO, /* 任务优先级 */ (CPU_STK *)&AppTaskStartStk[0], /* 堆栈基地址 */ (CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE / 10, /* 堆栈监测区,这里表示后10%作为监测区 */ (CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE, /* 堆栈空间大小 */ (OS_MSG_QTY )0, /* 本任务支持接受的最大消息数 */ (OS_TICK )0, /* 设置时间片 */ (void *)0, /* 堆栈空间大小 */ (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); OS_CRITICAL_EXIT(); //退出临界区 /* 启动多任务系统,控制权交给uC/OS-III */ OSStart(&err); while(1); } /* ************************************************************************************* * 函 数 名: AppTaskStart * 功能说明: 这是一个启动任务,在多任务系统启动后,必须初始化滴答计数器。 * 形 参: p_arg 是在创建该任务时传递的形参 * 返 回 值: 无 优 先 级: 2 ************************************************************************************* */ static void AppTaskStart (void *p_arg) { OS_ERR err; CPU_SR_ALLOC(); //初始化局部变量cpu_sr,用来存储关中断标志。 (void)p_arg; CPU_Init(); bsp_Init(); BSP_Tick_Init(); #if OS_CFG_STAT_TASK_EN 》 0u OSStatTaskCPUUsageInit(&err); #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif OS_CRITICAL_ENTER(); //进入临界区 /**************创建LED1任务*********************/ OSTaskCreate((OS_TCB *)&AppTaskLed1TCB, (CPU_CHAR *)“App Task Led1”, (OS_TASK_PTR )AppTaskLed1, (void *)0, (OS_PRIO )APP_TASK_LED1_PRIO, (CPU_STK *)&AppTaskLed1Stk[0], (CPU_STK_SIZE )APP_TASK_LED1_STK_SIZE / 10, (CPU_STK_SIZE )APP_TASK_LED1_STK_SIZE, (OS_MSG_QTY )5, (OS_TICK )0, (void *)0, (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); /**************创建LED2任务*********************/ OSTaskCreate((OS_TCB *)&AppTaskLed2TCB, (CPU_CHAR *)“App Task Led2”, (OS_TASK_PTR )AppTaskLed2, (void *)0, (OS_PRIO )APP_TASK_LED2_PRIO, (CPU_STK *)&AppTaskLed2Stk[0], (CPU_STK_SIZE )APP_TASK_LED2_STK_SIZE / 10, (CPU_STK_SIZE )APP_TASK_LED2_STK_SIZE, (OS_MSG_QTY )5, (OS_TICK )0, (void *)0, (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); OS_CRITICAL_EXIT(); //退出临界区 } static void AppTaskLed1(void *p_arg) { OS_ERR err; p_arg = p_arg; while(1) { bsp_LedToggle(1); OSTimeDlyHMSM(0,0,0,1000,OS_OPT_TIME_HMSM_STRICT,&err); } } static void AppTaskLed2(void *p_arg) { OS_ERR err; p_arg = p_arg; while(1) { bsp_LedToggle(2); OSTimeDlyHMSM(0,0,0,1000,OS_OPT_TIME_HMSM_STRICT,&err); } } /****************************END OF FILE********************************************/ 看着挺长的,主要就是实现了两个LED灯的闪烁,均是每隔一秒闪烁一次。编译没有错误。 第三步:修改接口文件 此时,将程序下载到开发板中,并不能实现预想的功能。因为有两处很重要的地方没有修改。 这两处分别是:系统滴答定时器中断函数和PendSV异常服务函数。 滴答定时器中断函数和PendSV异常服务函数的声明在启动文件startup_stm32f10x_hd.s中,但函数定义分别在os_cpu_c.c中和os_cpu_a.s中,这里需要修改函数的名字,使函数的声明和定义保持一致。 将工程下载到学习板中,LED等闪烁。至此,整个移植过程结束。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1602 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1536 浏览 1 评论
967 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
680 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1579 浏览 2 评论
1860浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
640浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
513浏览 3评论
527浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
500浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 11:43 , Processed in 0.758219 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号