uCosII移植STM32F103教程
移植环境
-
本文所使用的移植环境如下:
- 硬件环境为:STM32F103ZET6
- 软件环境为: MDK5.23
准备工作
(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>)
开始移植前需要准备一个空的工程模板和uCosII官方示例包,这里使用的是Micrium_uC-Eval-STM32F107_uCOS-II.zip版本,解压示例包移动源码 下载地址:
文件名 | 源文件路径 | 移动路径 |
---|---|---|
cpu.h、cpu_a.asm、cpu_c.c | MicriumSoftwareuC-CPUARM-Cortex-M3RealView | MicriumSoftwareuC-CPU |
lib_mem_a.asm | MicriumSoftwareuC-LIBPortsARM-Cortex-M3RealView | MicriumSoftwareuC-LIB |
os_cpu.h、os_cpu_a.asm、os_cpu_c.c、os_dbg.c | MicriumSoftwareuCOS-IIPortsARM-Cortex-M3GenericRealView | MicriumSoftwareuCOS-IIPorts |
在工程模板下创建uCosII文件夹,将上图三个文件夹复制到uCosII文件夹路径下
打开工程模板,创建如下四个分组uCOS-II_CPU、uCOS-II_LIB、uCOS-II_Ports、uCOS-II_Source:
分别导入如下路径下的.C和.asm文件(和导入头文件路径也一致):
|文件路径|
| :— |
|templateuCOS-IIuC-CPU |
|templateuCOS-IIuC-LIB|
|templateuCOS-IIuCOS-IIPorts|
|templateuCOS-IIuCOS-IISource|
添加完源码工程的所有文件
添加头文件路径
编译工程,提示缺少app_cfg.h文件,该文件在示例包MicriumSoftwareEvalBoardsMicriumuC-Eval-STM32F107uCOS-II路径下
将该路径下的app_cfg.h、app_hooks.c、cpu_cfg.h、includes.h、lib_cfg.h、os_cfg.h文件复制到templateuCOS-IIOS文件夹下,OS为新建文件夹
将MicriumSoftwareEvalBoardsMicriumuC-Eval-STM32F107BSP路径下bsp.c、bsp.h文件复制到templateuCOS-IIOS文件夹下
在工程中添加OS分组导入templateuCOS-IIOS下.c文件,并导入头文件到工程后编译,提示没有stm32f10x_lib.h文件
将stm32f10x_lib.h替换为stm32f10x.h,后再编译工程
提示没有bsp_os.h文件,删除除如下代码外的其他所有代码
void BSP_Init (void); CPU_INT32U BSP_CPU_ClkFreq (void);
将bsp.c文件中,以下函数删除
static void BSP_LED_Init (void); static void BSP_StatusInit (void); void BSP_Init (void)函数中代码全部删除,函数保留 void BSP_LED_Init (void) void BSP_LED_On (CPU_INT08U led) void BSP_LED_Off (CPU_INT08U led) void BSP_LED_Toggle (CPU_INT08U led) static void BSP_StatusInit (void) CPU_BOOLEAN BSP_StatusRd (CPU_INT08U id)代码全部删除
将工程中main.c文件修改为:
/* Includes ------------------------------------------------------------------*/ #include <includes.h> static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; static void AppTaskCreate (void); static void AppEventCreate (void); static void AppTaskStart (void *p_arg); int main(void) { /* Add your application code here*/ CPU_INT08U err; OSInit(); /* Initialize "uC/OS-II, The Real-Time Kernel" */ OSTaskCreateExt(AppTaskStart, /* Create the start task */ (void *)0, (OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1], APP_TASK_START_PRIO, APP_TASK_START_PRIO, (OS_STK *)&AppTaskStartStk[0], APP_TASK_START_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); #if (OS_TASK_NAME_EN > 0) OSTaskNameSet(APP_TASK_START_PRIO, "Start Task", &err); #endif OSStart(); /* Infinite loop */ while (1) { } } static void AppTaskStart (void *p_arg) { CPU_INT32U hclk_freq; CPU_INT32U cnts; (void)p_arg; BSP_Init(); /* Init BSP fncts. */ CPU_Init(); /* Init CPU name & int. dis. time measuring fncts. */ hclk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = hclk_freq / (CPU_INT32U)OS_TICKS_PER_SEC; /* Determine nbr SysTick increments in OS_TICKS_PER_SEC. */ OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ Mem_Init(); /* Init Memory Management Module. */ #if (OS_TASK_STAT_EN > 0) OSStatInit(); /* Determine CPU capacity */ #endif #if (APP_CFG_SERIAL_EN == DEF_ENABLED) /* Init serial port 0 to 115,2000 baud for use with ... */ // BSP_Ser_Init(115200); /* ... tracing. See app_cfg.h. */ #endif printf(("Creating Application Events...nr")); AppEventCreate(); /* Create Application Kernel objects */ printf(("Creating Application Tasks...nr")); AppTaskCreate(); /* Create application tasks */ while (DEF_TRUE) { /* Task body, always written as an infinite loop. */ OSTimeDlyHMSM(0, 0, 0, 100); } } static void AppTaskCreate (void) { } static void AppEventCreate(void) { }
注意
移植完以后需要将startup_stm32f10x_hd.s文件中以下函数进行修改
函数名 | 修改为 |
---|---|
PendSV_Handler | OS_CPU_PendSVHandler |
SysTick_Handler | OS_CPU_SysTickHandler |
重新编译
到此uCosII工程移植完毕
添加测试任务
添加调试串口驱动以后
创建任务栈
static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; static OS_STK AppTaskLed1Stk[APP_TASK_LED1_STK_SIZE]; static OS_STK AppTaskLed2Stk[APP_TASK_LED2_STK_SIZE]; static OS_STK AppTaskLed3Stk[APP_TASK_LED3_STK_SIZE];
创建任务和时间生成函数声明
static void AppTaskCreate (void); static void AppEventCreate (void); static void AppTaskStart (void *p_arg); static void AppTaskLed1 (void *p_arg); static void AppTaskLed2 (void *p_arg); static void AppTaskLed3 (void *p_arg);
任务栈大小定义
#define APP_TASK_START_STK_SIZE 128 #define APP_TASK_LED1_STK_SIZE 128 #define APP_TASK_LED2_STK_SIZE 128 #define APP_TASK_LED3_STK_SIZE 128 #define APP_CFG_TASK_LED_STK_SIZE 128
任务优先级定义
#define APP_TASK_START_PRIO 4 #define APP_TASK_LED1_PRIO 5 #define APP_TASK_LED2_PRIO 6 #define APP_TASK_LED3_PRIO 7
main函数
int main(void) { /* Add your application code here*/ CPU_INT08U err; OSInit(); OSTaskCreateExt(AppTaskStart, /* Create the start task */ (void *)0, (OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1], APP_TASK_START_PRIO, APP_TASK_START_PRIO, (OS_STK *)&AppTaskStartStk[0], APP_TASK_START_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); #if (OS_TASK_NAME_EN > 0) OSTaskNameSet(APP_TASK_START_PRIO, "Start Task", &err); #endif OSStart(); }
启动函数创建
static void AppTaskStart (void *p_arg) { CPU_INT32U hclk_freq; CPU_INT32U cnts; (void)p_arg; BSP_Init(); /* Init BSP fncts. */ CPU_Init(); /* Init CPU name & int. dis. time measuring fncts. */ hclk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = hclk_freq / (CPU_INT32U)OS_TICKS_PER_SEC; /* Determine nbr SysTick increments in OS_TICKS_PER_SEC. */ OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ Mem_Init(); /* Init Memory Management Module. */ #if (OS_TASK_STAT_EN > 0) OSStatInit(); /* Determine CPU capacity */ #endif printf(("Creating Application Events...nr")); AppEventCreate(); /* Create Application Kernel objects */ printf(("Creating Application Tasks...nr")); AppTaskCreate(); /* Create application tasks */ }
任务内容创建
static void AppTaskLed1(void *p_arg) { p_arg = p_arg; while(DEF_TRUE) { printf("LED1_TOGGLErn"); OSTimeDlyHMSM(0, 0, 1, 0); } } static void AppTaskLed2(void *p_arg) { p_arg = p_arg; while(DEF_TRUE) { printf("LED2_TOGGLErn"); OSTimeDlyHMSM(0, 0, 5, 0); } } static void AppTaskLed3(void *p_arg) { p_arg = p_arg; while(DEF_TRUE) { printf("LED3_TOGGLErn"); OSTimeDlyHMSM(0, 0, 10, 0); } }
任务创建
static void AppTaskCreate (void) { OSTaskCreateExt(AppTaskLed1, /* Create the Led1 task */ (void *)0, (OS_STK *)&AppTaskLed1Stk[APP_TASK_LED1_STK_SIZE - 1], APP_TASK_LED1_PRIO, APP_TASK_LED1_PRIO, (OS_STK *)&AppTaskLed1Stk[0], APP_TASK_LED1_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSTaskCreateExt(AppTaskLed2, /* Create the Led2 task */ (void *)0, (OS_STK *)&AppTaskLed2Stk[APP_TASK_LED2_STK_SIZE - 1], APP_TASK_LED2_PRIO, APP_TASK_LED2_PRIO, (OS_STK *)&AppTaskLed2Stk[0], APP_TASK_LED2_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSTaskCreateExt(AppTaskLed3, /* Create the Led3 task */ (void *)0, (OS_STK *)&AppTaskLed3Stk[APP_TASK_LED3_STK_SIZE - 1], APP_TASK_LED3_PRIO, APP_TASK_LED3_PRIO, (OS_STK *)&AppTaskLed3Stk[0], APP_TASK_LED3_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); }
事件创建为空
static void AppEventCreate(void) { }
测试程序是创建了一个启动任务和用串口模拟控制三个led状态翻转的任务,翻转周期分别为1s,5s,10s,运行现象如下
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- c/s架构开发-C#下基于C/S架构的任务管理系统——开发安装
- pthread_create 线程属性-Linux学习——线程的创建和回收
- c++实现一个堆-包含插入删除获取
- Golang编译的二进制文件在alpine中无法运行
- C++如何简单快速去除容器中的重复元素
- 让devc++使用c++11标准
- git常用指令
- 纯C++实现字符版坦克大战
- c++中类的数据成员初始化次序
- 纯C++实现字符版推箱子
- git下载子模块失败问题解决办法
- 基于Jekyll与Github Pages搭建博客
- HTML5项目笔记3:使用Canvas设计离线系统的Logo
- linux系统开mc服务器
- 红队技术-Cobaltstrike之Linux上线
- 权限维持-Linux后门
- 万万没想到,go的数据库操作,也能像php一样溜了
- Typora+PicGo+GitHub实现图片快速上传
- Linux计划任务服务程序
- 2022 如何在 GitHub 上搭建个人网站(github.io)