【UC/OS-II】一、STM32平台移植教程

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


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


下面我们开始移植!

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




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





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




第三步:因为这些文件没有关联到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"




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

这里我删除了 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      
#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%的矩形波!

  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值