UC/OS-II学习笔记--STM32移植



步骤如下:

步骤1Micrium官方下载相关型号的UCOS-II源代码;

步骤2新建工程,然后除了添加日常的工程文件外,还需要在工程组里添加四个文件

 

1.gif

由这个关系图可知,我们需要在工程里新建的文件夹

2.1  APP: 用户的外设硬件驱动程序;里面有四个文件:

       app.c       //新建的,用户自己编写

       app.h          //新建的,用户自己编写

       app_cfg.h   //新建的,用户自己编写,用来配置应用软件,主要是任务的优先级、中断优先级和堆栈大小等;

       os_cfg.h // OS本身的对应用软件的配置

 

22.jpg

2.2   uCOS-II\Source: OS源文件,里面有11个文件,10C 1个头文件,来自于Micrium\Software\Ucos-II

   11.jpg

 2.3   uCOS-II\Ports:  OSCPU端口配置文件,里面有4个文件,两个C,一个头文件,一个汇编文件,来自

 

2.jpg
os_cpu.h
os_cpu_a.asm
os_cpu_c.c
os_dgb.c

 

2.4   BSP 用户外设具体的驱动程序,比如说led.clcd.c等;至少有两个

BSP.c

BSP.h

 

注意1:从Micrium中拷贝文件过来后,对于PORTS文件夹,去掉只读属性;

注意2:在target 里添加这四个文件夹的编译路径;

 

步骤3修改uC/OS-II

  3.1  os_cfg.h

 用来配置系统功能的,也就是使能或禁用各个功能模块,以及设置相关最小最大值;

 

3.jpg
4.jpg

禁用 信号量、互斥信号量、邮箱、队列、信号量集、定时器、内存管理,关闭调试模式

禁用:  应用软件的钩子函数和多重事件控制,如果用不着的话;

#define OS_APP_HOOKS_EN           0

#define OS_EVENT_MULTI_EN         0 

 

3.2   修改os_cpu.h

void       OS_CPU_SysTickHandler(void);

void       OS_CPU_SysTickInit(void);

INT32U     OS_CPU_SysTickClkFreq(void);

 

注释掉前面这三个函数

 

3.3  修改os_cpu_c.c

#if 0  … #endif 注释掉三个地方:

#define  OS_CPU_CM3_NVIC_ST_CTRL    (*((volatile INT32U *)0xE000E010))

#define  OS_CPU_CM3_NVIC_ST_RELOAD  (*((volatile INT32U *)0xE000E014)) 

#define  OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018))  

#define  OS_CPU_CM3_NVIC_ST_CAL     (*((volatile INT32U *)0xE000E01C))   

#define  OS_CPU_CM3_NVIC_PRIO_ST    (*((volatile INT8U  *)0xE000ED23))  

#define  OS_CPU_CM3_NVIC_ST_CTRL_COUNT                    0x00010000               

#define  OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC                  0x00000004               

#define  OS_CPU_CM3_NVIC_ST_CTRL_INTEN                    0x00000002          

#define  OS_CPU_CM3_NVIC_ST_CTRL_ENABLE                   0x00000001                

#define  OS_CPU_CM3_NVIC_PRIO_MIN                               0xFF

 

void  OS_CPU_SysTickHandler (void)函数

void  OS_CPU_SysTickInit (void) 函数


3.4  修改os_cpu_a.asm


将原来的 RSEG CODE:CODE:NOROOT(2)


  改成:


AREA |.text|, CODE, READONLY, ALIGN=2         ;AREA |.text| 选择段 |.text|。


                                                      ;CODE表示代码段,READONLY表示只读(缺省)


                                                      ;ALIGN=2表示4字节对齐。若ALIGN=n,这2^n对齐


THUMB                                         ;Thumb 代码


REQUIRE8                                      ;指定当前文件要求堆栈八字节对齐


PRESERVE8                                     ;令指定当前文件保持堆栈八字节对齐


 


3.5  修改os_dbg.c


由于编译器不同,使用keil时,需要把


#define  OS_COMPILER_OPT  __root


改成:


#define  OS_COMPILER_OPT  //__root


 


3.6  修改启动文件startup_stm32f10x_hd.s


由于我们是使用STM32自带的启动文件,所以需要在这里面设置OS_CPU的嘀嗒定时器中断向量,


因此把PendSV_Handler全部换成OS_CPU_PendSVHandler,一共就三处需要更换的;


 


步骤4  编写通用的必要文件


4.1 编写includes.h


    新建头文件,添加在user文件夹里,然后写入以下代码,所以用户的外设驱动头文件都应该被包含在这里面


#ifndef __INCLUDES_H


#define __INCLUDES_H


 


#include "stm32f10x.h"


#include "stm32f10x_rcc.h"


 


#include "uCOS_II.h"


#include "BSP.h"                //与开发板相关的函数


#include "app.h"


#include "led.h"


 


#endif


 


4.2   编写外设驱动文件 BSP.c 及头文件BSP.h


     BSP.c 至少应该包含两个函数


   1  void BSP_Init(void)


 {


    SystemInit();      /*stystem config as 72MHz*/


LED_GPIO_Config(); /*LED GPIO configuration */


 }


   2   void SysTick_init(void)


{


   SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC);


   /*初始化并使能SysTick定时器*/


}


 


头文件BSP.h


#ifndef __BSP_H


#define __BSP_H


 


void SysTick_init(void);


void BSP_Init(void);


 


#endif


 


 


4.3  修改stm32f10x_it.c


1)添加头文件:#include "includes.h"


2)注释掉原来的头文件://#include "stm32f10x_it.h"


3)在定时中断服务函数里加入以下代码:


void SysTick_Handler(void)


{


    OSIntEnter();


    OSTimeTick();


    OSIntExit();


}


 


 


4.4 编写app_cfg.h 来设置任务优先级和堆栈大小


#ifndef __APP_CFG_H__


#define __APP_CFG_H__


 


/***************设置任务优先级******************/


#define STARTUP_TASK_PRIO    4


 


/**********设置栈大小(单位为OS_STK)************/


#define STARTUP_TASK_STK_SIZE 80


#endif


 


4.5 编写app.c app.h 创建用户任务


 


4.6 编写main.c 主函数


#include "includes.h"


static OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE]; //定义栈


int main(void)


{        


 BSP_Init();


 OSInit();


 OSTaskCreate(Task_LED,(void*)0,


 &startup_task_stk[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO);


 


 OSStart();


 return 0;


}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值