zl程序教程

您现在的位置是:首页 >  其他

当前栏目

uCosII移植STM32F103教程

2023-02-26 12:27:07 时间

移植环境

  1. 本文所使用的移植环境如下:

    • 硬件环境为: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移植STM32F103教程

在工程模板下创建uCosII文件夹,将上图三个文件夹复制到uCosII文件夹路径下

打开工程模板,创建如下四个分组uCOS-II_CPU、uCOS-II_LIB、uCOS-II_Ports、uCOS-II_Source:

uCosII移植STM32F103教程

分别导入如下路径下的.C和.asm文件(和导入头文件路径也一致):

|文件路径|
| :— |
|templateuCOS-IIuC-CPU |
|templateuCOS-IIuC-LIB|
|templateuCOS-IIuCOS-IIPorts|
|templateuCOS-IIuCOS-IISource|

uCosII移植STM32F103教程

uCosII移植STM32F103教程

uCosII移植STM32F103教程

添加完源码工程的所有文件

uCosII移植STM32F103教程

uCosII移植STM32F103教程

添加头文件路径

uCosII移植STM32F103教程

编译工程,提示缺少app_cfg.h文件,该文件在示例包MicriumSoftwareEvalBoardsMicriumuC-Eval-STM32F107uCOS-II路径下

uCosII移植STM32F103教程

将该路径下的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文件夹下

uCosII移植STM32F103教程

在工程中添加OS分组导入templateuCOS-IIOS下.c文件,并导入头文件到工程后编译,提示没有stm32f10x_lib.h文件

uCosII移植STM32F103教程

将stm32f10x_lib.h替换为stm32f10x.h,后再编译工程

uCosII移植STM32F103教程

提示没有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移植STM32F103教程

重新编译

uCosII移植STM32F103教程

到此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,运行现象如下

uCosII移植STM32F103教程

uCosII移植STM32F103教程


本站部分内容转载自网络,版权属于原作者所有,如有异议请联系QQ153890879修改或删除,谢谢!
转载请注明原文链接:uCosII移植STM32F103教程

你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:

1、点击这里立即申请成为腾讯云VIP客户

2、点击这里立即注册成为天翼云VIP客户

3、点击这里立即申请成为华为云VIP客户

4、点击这里立享阿里云产品终身VIP优惠价

喜欢 (0)
[[email protected]]
分享 (0)