因为一开始就讲STM32的UC/OS-ii的移植对于不了解系统的小白来说可能看不懂,但我的开发平台是基于STM32的,所以又不得不先说明移植教程,所以在这里建议不懂的可以去网上先下个可运行的STM32的移植环境进行开发,等熟悉系统后回来再看!我是先看系统的整个代码框架,这样我可以不开发也会搭建了!也可以学我的流程,买本书先看看UC/OS操作系统的整个框架!说白了,其实操作系统就是个“库”!


在搭建环境之前,我们必须要有一个正常的STM32的开发环境,就是通过编译的STM32开发环境,我也是基于我上面说过的环境进行移植的,可以参考我上面的文章--STM32之MDK(Keil)环境搭建!

下面我们开始移植!

先来看UC/OS的代码结构,我们必须需要的就是图中红色的框,网上很多对于文件的个数可能不同,其实只是功能多少和环境不同决定的,但都是在这个几个基础上添加的(这里不讨论代码的剪裁操作)!还有注意,网上下载的代码中,Section3可能没有,所以你去网上下载就可以了,到处都是!

codesys 移植到 stm32_UCOS-ii 嵌入式 操作系统 移植




第一步:打开搭建好编译通过的Keil开发环境,创建如下文件夹,在相应的工程文件夹下也创建如下文件,



codesys 移植到 stm32_#include_02

codesys 移植到 stm32_codesys 移植到 stm32_03

codesys 移植到 stm32_stm32_04






第二步:把下载的相应文件复制到文件下,并添加在工程里。



codesys 移植到 stm32_#define_05

codesys 移植到 stm32_#include_06

codesys 移植到 stm32_#include_07




第三步:因为这些文件没有关联到stm32,所以我们建立一个h文件includes.h使他们关联,includes.h根据自己的环境搭建的头文件引用来编写!我这里因为定义了一个config.h的全局头文件,所以我就把下面的代码放进这个文件!




#include <stdio.h> 

 #include <string.h> 

 #include <ctype.h> 

 #include <stdlib.h> 

 #include <stdarg.h> 



 #include "ucos_ii.h" 

 #include "os_cpu.h" 

#include "os_cfg.h"

codesys 移植到 stm32_stm32_08




这样我们这个操作系统的代码框架已经搞定了,接下来就是配置代码了,其实就是中断的改名字和时钟的设置!

这里我删除了 OS_DBG.C这个文件,为了减少错误就直接删除,不影响!


下面开始修改文件:


第一步:打开os_cfg.h,
 

#define OS_APP_HOOKS_EN           1u 
改成
#define OS_APP_HOOKS_EN           0u 


第二步 :打开os_cpu_a.asm  


    PUBLIC   OS_CPU_SR_Save                                      ; Functions declared in this file
    PUBLIC   OS_CPU_SR_Restore
    PUBLIC   OSStartHighRdy
    PUBLIC   OSCtxSw
    PUBLIC   OSIntCtxSw
    PUBLIC   OS_CPU_PendSVHandler
改成
    EXPORT   OS_CPU_SR_Save                                      ; Functions declared in this file
    EXPORT   OS_CPU_SR_Restore
    EXPORT   OSStartHighRdy
    EXPORT   OSCtxSw
    EXPORT   OSIntCtxSw
    EXPORT   OS_CPU_PendSVHandler



     RSEG CODE:CODE:NOROOT(2)
     THUMB
改成
     AREA |.text|, CODE, READONLY, ALIGN=2
     THUMB 
     REQUIRE8 
     PRESERVE8 


第三步:打开startup_stm32f10x_md.s

把所有的
PendSV_Handler
替换为
OS_CPU_PendSVHandler

把所有的
SysTick_Handler
替换为
OS_CPU_SysTickHandler


这样就完成了移植了!


最后我随便编了一个PB5口1s高低电平变化的程序,代码如下:


#include "config.h"


 #define START_TASK_PRIO       10
 #define START_STK_SIZE          64
 OS_STK START_TASK_STK[START_STK_SIZE];
 void start_task(void *pdata); 
     
 #define LED0_TASK_PRIO       7 
 #define LED0_STK_SIZE      64
 OS_STK LED0_TASK_STK[LED0_STK_SIZE]; void led0_task(void *pdata);

 void start_task(void *pdata)
 {
   OS_CPU_SR cpu_sr=0;
   pdata = pdata; 
   OS_ENTER_CRITICAL();    
   OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);     
   OSTaskSuspend(START_TASK_PRIO); 
   OS_EXIT_CRITICAL(); 
 }

 void led0_task(void *pdata)
 {  
 unsigned int i=2000,j=2000; 
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
Delay_ms(1000);

GPIO_SetBits(GPIOB,GPIO_Pin_5); 
                 Delay_ms(1000); 
};
 }


 int main (void)
 {
         SysTick_Init();

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

LED_Init();

OSInit();   
   OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );
OSStart();
 }



编译烧写入单片机,运行,PB5端口输出周期为2s,占空比为50%的矩形波!