IAR环境下ucosii在STM32上的移植

发布者:自由梦想最新更新时间:2024-10-21 来源: cnblogs关键字:IAR环境  ucosii  STM32  移植 手机看文章 扫描二维码
随时随地手机看文章

Ucosii移植到STM32上

1.使用的开发环境是IAR 5.4       STM32芯片为STM32F103ZET6

使用ST官方提供的标准固件库,建立工程,

我下载的苦艰苦的版本为STM32F10x_StdPeriph_Lib_V3.5.0,里面的文件分布为:


其中,Libraries文件夹里面放的是标准库文件,Project文件夹里面放的是STM32的各个外设的使用范例和一个工程模板,Utilities文件夹里面放的是ST公司的评估板例子,剩下的文件就是教我们怎样使用标准库,而我们主要使用的就是Libraries和Project里面的文件。

1.1首先新建stm32这个文件夹,在里面再新建3个文件夹include,project和src,用来存放头文件、工程文件和源文件。

   对标准库文件进行整理,将我们需要的文件拷出来,由于Libraries下的CMSIS文件夹中很多代码是和编译器及芯片相关的,导致文件夹多且深度大,不利于工程维护,实际上一个项目往往是用固定的编译器和芯片,因此有必要对库进行整理。
    在src下建立libstm32目录
    1. 把LibrariesSTM32F10x_StdPeriph_Driver下的内容拷贝到libstm32目录下
    2. 在libstm32目录下建立cmsis文件夹,把LibrariesCMSISCM3CoreSupport下的core_cm3.c,core_cm3.h;LibrariesCMSISCM3DeviceSupportSTSTM32F10x下的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h拷贝到cmsis文件夹中。
    3. 根据你所选的芯片类型将

LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm下对应的启动文件拷贝到cmsis文件夹中。这里我拷贝的是startup_stm32f10x_hd.s(大容量型stm32芯片的启动文件)。

下面对这几个文件简单介绍:
    LibrariesSTM32F10x_StdPeriph_Driver下的内容很好理解就是stm32的各个外设模块驱动代码。
    misc.h和misc.c是和CM3内核有关的NVIC和SysTick的驱动代码。  
       core_cm3.c, core_cm3.h
    它们的目录名为CoreSupport,说明这两个文件是CM3内核支撑文件,其他使用CM3内核的芯片也可以用,不一定是stm32。这两个文件用来获取设置CM3内核,配置一些内核寄存器
    stm32f10x.h, system_stm32f10x.c, system_stm32f10x.h和startup_stm32f10x_hd.s在DeviceSupport目录下,说明这几个文件是和具体的芯片有关的,也就是stm32芯片的支撑文件。其中stm32f10x.h是标准外设库的入口,使用标准外设库的代码中必须包含该头文件。system_stm32f10x.c, system_stm32f10x.h这两个文件提供函数用来初始化stm32芯片,配置PLL、系统时钟和内置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的启动文件。

1.2建立工程

在IAR中新建ARM工程,工程名为stm32,将工程文件放在project文件夹中,在IAR中对工程添加组(add group)include,src,srcbsp,srcapp,libstm32。

将libstm32目录下所有的c文件和s文件加载到工程中的libstm32。

在src目录下新建一个app目录用来放用户文件,将ProjectSTM32F10x_StdPeriph_Template下的stm32f10x_it.c拷贝到app目录,并在此目录下新建一个main.c文件,作为系统的主文件。

stm32f10x_it.h,stm32f10x_conf.h拷贝到include文件夹中。

根据所选芯片,把LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartupiar startup_stm32f10x_hd.s加载到工程中。

stm32f10x_it.c,stm32f10x_it.h是中断服务程序文件。stm32f10x_conf.h是标准外设库的配置文件,对于工程中不需要的外设,可以注释掉里面的包含的头文件。这里我建议先仅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什么再打开什么,这样编译起来快一点,当然也可都留着。

1.3修改标准库文件,使其适合自己的芯片

在stm32f10x.h的66-73行,根据所选芯片类型,去掉相应注释,这里我去掉STM32F10X_HD行的注释(大容量型stm32芯片)。

去掉105行的USE_STDPERIPH_DRIVER注释,启用stm32标准外设库。

在system_stm32f10x.c的110-115行,根据所选芯片主频,去掉相应注释,默认SYSCLK_FREQ_72MHz注释已去掉,如果你的芯片主频是72MHz,就不用做修改了。

1.4点亮一个led灯

在src下建立一个bsp目录用来放置板级支持代码,建立led.c,led.h。

led.h


  1. #ifndef _LED_H_


  2. #define _LED_H_


  3. #include 


  4. #define LED_0 0


  5. void led_init(void);


  6. void led_on(uint32_t n);


  7. void led_off(uint32_t n);


  8. #endif



led.c


  1. #include 'stm32f10x.h'


  2. #include 'led.h'


  3. void led_init(void)


  4. {


  5.        GPIO_InitTypeDef GPIO_InitStructure;


  6.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);


  7.        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;


  8.        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;


  9.        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;


  10.        GPIO_Init(GPIOF,&GPIO_InitStructure);


  11. }


  12. void led_on(uint32_t n)


  13. {


  14.        switch(n)


  15.        {


  16.               case LED_0:


  17.               GPIO_SetBits(GPIOF,GPIO_Pin_6);


  18.               break;


  19.               


  20.               default:


  21.               break;


  22.        }


  23. }


  24. void led_off(uint32_t n)


  25. {


  26.        switch(n)


  27.        {


  28.               case LED_0:


  29.               GPIO_ResetBits(GPIOF,GPIO_Pin_6);


  30.               break;


  31.               


  32.               default:


  33.               break;


  34.        }


  35. }

   

main.c

  1. #include 'led.h'


  2. int main(void)


  3. {


  4.        led_init();


  5.        for(;;)


  6.        {


  7.        led_on(LED_0);


  8.        


  9.        }


  10. }


 

将相应的头文件加载到工程中,编译下载,没有什么问题的话,led灯会亮,此时,工程已建立。


2.移植ucosii

从micrium官网上下载官方移植版本ucosii2.86 iar。

解压后得到如下文件:

      

AppNotes包含ucosii移植说明文件。这两个文件中我们仅需关心MicriumAppNotesAN1xxx-RTOSAN1018-uCOS-II-Cortex-M3AN-1018.pdf。因为这个文件对ucosii在CM3内核移植过程中需要修改的代码进行了说明。
   Licensing包含ucosii使用许可证。
   Software下有好几个文件夹,在本文的移植中仅需关心uCOS-II即可。

在src下新建目录ucosii,在ucosii下新建目录ports和src。

将MicriumSoftwareuCOS—IIports下的文件拷贝到srcucosiiports,

将MicriumSoftwareuCOS—IISource下的文件拷贝到srcucosiisrc,

其中,ports下的文件是一只需要修改的,而src下的文件是不需要修改的。

移植步骤:

2.1.将os_cpu_c.h文件中的最后的三个函数void       OS_CPU_SysTickHandler(void);
void       OS_CPU_SysTickInit(void);
INT32U     OS_CPU_SysTickClkFreq(void);

注释掉。

OS_CPU_SysTickHandler()定义在os_cpu_c.c中,是SysTick中断的中断处理函数,而stm32f10x_it.c,中已经有该中断函数的定义SysTick_Handler(),这里也就不需要了。
    OS_CPU_SysTickInit()定义在os_cpu_c.c中,用于初始化SysTick定时器,它依赖于OS_CPU_SysTickClkFreq(),而此函数我们自己会实现,所以注释掉。
    OS_CPU_SysTickClkFreq()定义在BSP.C (MicriumSoftwareEvalBoards)中,而本文移植中并未用到BSP.C,后面我们会自己实现,因此可以把它注释掉。

2.2.由于我们开发程序时,使用的是标准外设库提供的启动文件,而该启动文件已经有SysTick中断函数的定义,micrium公司开发移植版的ucosii时没有使用标准外设库的SysTick中断函数,自定义的中断向量为OS_CPU_SysTickHandler和OS_CPU_PendSVHandler,这就涉及到一个统一的问题了,问题的解决办法是,在启动文件中,PendSV中断向量名为PendSV_Handler,所以只需用OS_CPU_PendSVHandler把所有出现PendSV_Handler的地方替换掉就可以了。

至于OS_CPU_SysTickHandler,我们采用的方法是自己重新写一个,避免对启动文件的修改,方便以后开发。

2.3在工程中添加组ucosii,在ucosii下添加组port和src,将srcucosiiports和srcucosiisrc下的文件添加进工程,别忘了os_cpu_a.asm文件。工程目录为:

2.4在include目录下建立一个新的app_cfg.h文件,拷贝MicriumSoftwareEvalBoardsSTSTM32F103ZE-SKIAROS-Probe-LCD目录下的os_cfg.h到include目录下,将这两个文件添加到工程中。

修改os_cfg.h中的

#define OS_APP_HOOKS_EN           0
#define OS_DEBUG_EN               0
#define OS_EVENT_MULTI_EN         0
#define OS_SCHED_LOCK_EN          0
#define OS_TICK_STEP_EN           0
#define OS_TASK_CHANGE_PRIO_EN    0
#define OS_TASK_QUERY_EN          0
#define OS_TASK_STAT_EN           0
#define OS_TASK_STAT_STK_CHK_EN   0
#define OS_TASK_SUSPEND_EN        0
#define OS_FLAG_EN                0
#define OS_MBOX_EN                0
#define OS_TIME_DLY_HMSM_EN       0
#define OS_TIME_DLY_RESUME_EN     0
#define OS_TIME_GET_SET_EN        0
#define OS_TIME_TICK_HOOK_EN      0

编写app_cfg.h


#ifndef _APP_CFG_


  1. #define _APP_CFG_


  2. #define OS_TASK_TMR_PRIO 3


  3. /* task priority */


  4. #define STARTUP_TASK_PRIO 6


  5. /* task stack size */


  6. #define STARTUP_TASK_STK_SIZE 80


  7. #define Task1_Stk_Size 64


  8. #define Task1_Prio 11


  9. #endif

 

2.5编写系统SysTick中断和任务。

   还要在stm32f10x_it.c中添加SysTick中断处理代码:


  1. void SysTick_Handler(void)


  2. {


  3.        OS_CPU_SR cpu_sr;


  4.        OS_ENTER_CRITICAL();


  5.        OSIntNesting++;


  6.        OS_EXIT_CRITICAL();

      

  7.     OSTimeTick();


  8.     OSIntExit();


  9. }


main.c


  1. #include 'ucos_ii.h'


  2. #include 'stm32f10x.h'


  3. #include 'led.h'


  4. #include 'stm32f10x_rcc.h'


  5. static OS_STK Task1_stk[Task1_Stk_Size];


  6. static void Task1(void *p_arg)


  7. {


  8.          for (;;)


  9.          {


  10.                  led_on(LED_0);


  11.                  OSTimeDly(500);


  12.                  led_off(LED_0);


  13.                  OSTimeDly(500);


  14.          }


  15. }


  16. static void systick_init(void)


  17. {


  18.           SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC);


  19.     


  20. }


  21. int main(void)


  22. {


  23.         INT8U err;


  24.        SystemInit();


  25.         systick_init();


  26.          led_init();


  27.          OSInit();


  28.          OSTaskCreate(Task1, (void *)0,

[1] [2]
关键字:IAR环境  ucosii  STM32  移植 引用地址:IAR环境下ucosii在STM32上的移植

上一篇:STM32系列是大端还是小端?
下一篇:STM32启动文件选择说明

推荐阅读最新更新时间:2026-03-18 10:40

STM32学习记录13 ucosII移植
关于如何移植,建立工程的问题已经有很多文档说明了,此处只是说明一下需要修改的文件及修改的原因。 1:os_cpu.h 我们需要对此文件进行修改: 1) void OS_CPU_PendSVHandler(void) 需替换成 void PendSV_Handler(void) 一般我们自己开发基于 stm32 芯片的软件,都会使用标准外设库 CMSIS 中提供的启动文件,比如 startup_stm32f10x_hd.s,而 Micrium 官方没有用 ST 的标准启动文件,而且分开写成了两个.s 文件,即 init.s 和 vectors.s (Micrium\Software\EvalBoards\ST\STM3210B
[单片机]
ucosiistm32上的移植详解5
详解1-4把移植过程都已经介绍了。接下来的工作是验证移植是否ok以及如何基于移植好的ucosii开发应用程序。前一个问题可以说是后一个问题的特殊情况,一般我们会创建两个简单的任务,看看任务切换是否成功来验证移植是否ok,因为任务切换可以说是ucosii最核心的功能。 任务代码(main.c): static void task1(void *p_arg) { for (;;) { led_on(LED_0); OSTimeDly(500); led_off(LED_0); OSTimeDly(500); } } static void t
[单片机]
ucosiistm32上的移植详解1
虽然目前网上已经有不少关于ucosii在stm32上的移植版本,包括micrium也有官方移植版本。但这些版本具体是怎么移植出来的,又该怎么基于移植好的ucosii开发应用软件,网上介绍的并不多。这里介绍一下我的移植经历,希望对大家有所帮助。 我的移植基本上是从零开始的。首先想要做好移植,有两方面的内容是必须要了解。1.目标芯片;2.ucosii内核原理。 虽然我们移植的目标芯片是stm32,但操作系统的移植基本是针对Cortex-M3内核(以下简称CM3)而言的,所以我们只需了解CM3内核就好了。stm32芯片就是CM3内核加上各种各样的外设。 怎么才能了解CM3呢?看一本书 ARM Cortex-M3权威指南 (
[单片机]
单片机---STM8L移植ucosII系统
初次听说ucos还是在还大学即将毕业的时候,姐夫给我介绍他研发的产品,用的ucosII,还特别热心的给我准备了一套调试的东西和代码,当时也是没耐心,心思也没放在上面,后来也就没下文了,想起来当时还是挺无知的,有价值的东西放在面前,都没有发现,早点开始学习,没准现在也应该能在另一方面有点成就了。 不过学习这种事,对于普通人来说,很少是天生就能去接受,毕竟这是一件令人承受压力的过程,尤其是对于年轻人来说,就是需要一点挫折一点悔悟,才有一点积累,才能享受一点进步。我们都希望孩子从小热爱学习,其实都是那份成绩带来的虚荣在推动,很少去思考学习真正的目的。 直到我们进入了社会,才知道学习能够带来的巨大作用,原来,学习,是真的香,知识,
[单片机]
单片机---STM8L<font color='red'>移植</font><font color='red'>ucosII</font>系统
移植ucosII到STM32F103ZE(六)
一、 例程测试: 1. 编写includes.h文件 #ifndef __INCLUDES_H__ #define __INCLUDES_H__ //#include stdio.h //#include string.h //#include ctype.h //#include stdlib.h //#include stdarg.h #include stm32f10x_conf.h #include stm32f10x.h #include ucos_ii.h #include app_cfg
[单片机]
移植ucosii遇到的问题 B OSStartHang
ucosii在STM32rbt6上可以正常地运行,工作需要,我将ucosii移植到STM32F103C8T6,更换了一下启动代码,结果程序 开始调度时就死在 那了 OSStart(); 进去后 void OSStart (void) { if (OSRunning == OS_FALSE) { OS_SchedNew(); OSPrioCur = OSPrioHighRdy; OSTCBHighRdy = OSTCBPrioTbl ; OSTCBCur = OSTCBHighRdy; OSStartHighRdy(); } }停在黑色加粗,通过调试找到汇编代码.asm里边 OSStartHang B OSStartHang 这个
[单片机]
ICCAVR下移植于ATMEGA32的UCOSII
费了九牛二虎之力终于把UCOSII移植到M32上了,似乎没有想怪中那么兴奋,只是感觉轻松了许多,因为原本打算是在三个星期前搞定的,想想根本原因是没有把握好调试程序时的一些细节,为了一些不可能的东西在钻牛角尖.... 计算机网络的老师给我们讲过大部人都是"蜗牛"!?,只有少部分人是"老鹰"......"老鹰"可以一下冲上高空,而"蜗牛"只有慢慢地爬,也可以到达山顶.不过我觉得只要蜗牛掌握了正确的方法或许也有机会变成---老鹰!(也许其他的蜗牛们也是这么想的~~) 废话少说了.其实正确的写法是uC/OS-II,u就是micro的意思,为了方便均用UCOSII代替,要移植UCOSII必须要知道编译器的堆栈情况.ICCAVR的堆
[单片机]
ICCAVR下<font color='red'>移植</font>于ATMEGA32的<font color='red'>UCOSII</font>
stm32ucosII加上ucGUI学习
一、学会使用Keil调试工具。 单步调试,跳过函数,跳出函数 可以快速定位到程序的bug位置 二、系统板级驱动要加载需要的函数 三、怎么一步步根据具体需要添加系统功能 程序开发过程 1、加入所用到的封装库 2、写板级驱动BSP 包括GPIO配置 时钟配置 所用到的各种初始化函数用同一的void BSP_Init(void)函数调用 3、编写stm32f10x_it.c文件,设置中断服务函数 4、建立任务,包括定义任务名(函数名),堆栈空间(一个数组),任务优先级(一个宏定义) 5、任务优先级的选择,不合理的优先级,会导致程序无法正常运行,例如有7个任务,界面任务,触摸任务,三个L
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved