【stm32+uC/OS-II】ucosii移植简单详细步骤

发布者:心愿达成最新更新时间:2020-03-04 来源: eefocus关键字:stm32  OS-II  ucosii移植 手机看文章 扫描二维码
随时随地手机看文章

μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。 μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。


——摘自百度百科


经过三天对uC/OS-II的研究和琢磨,成功移植了自己的uC/OS-II;回首看下,简单的移植是非常简单的;可能这句话比较啰嗦,等我下面解析完之后就认同了;


首先,来附图,我相信只要刚刚认识ucosii的人,都见过这种类型的图了;而且版本不一;

这个是摘自一个教程上面的,但是我觉得还是有点复杂,然后,我又仔细的精简了框架和代码;当然只适合初学者;

可能有人还不知道什么是BSP,Board Support Package,板级支持包;这样的话,一看我们的代码就可以分为四部分了;


为了有点逻辑,我从uC/OS-II Source开始说起;这部分代码大家都知道是不用修改的,但是我们至少要知道他依赖的外部头文件都有哪些;


Step one:

+------------------------------------------

|core: os_core.c

|  os: os_flag.c    os_mbox.c

|  os_mem.c     os_mutex.c

|  os_q.c       os_sem.c

|  os_task.c    os_time.c

|      os_tmr.c

|head: ucos_ii.h

+------------------------------------------


理论上这几个文件我们完全不用修改!但是,他依赖外部的一些头文件;

app_cfg.h //应用程序的一些功能,目测这里是不需要的;但是他已经写了,那我们就保留吧;所以我们就要先建立一个空的app_cfg.h文件

os_cfg.h //做一些os功能的开关,我们可以由此来对系统进行一些裁剪;保留我们需要的功能;

os_cpu.h //为了适应os,我们必须把os与cpu之间建立一个桥梁;就是通过os_port来进行建立的;


step two:

os_ports 在uCOS-IIPortsARM-Cortex-M3GenericIAR

os_cpu_c.c //有两个地方要说下:1:在stm32的启动代码里面已经有一些功能函数了,所以我们要把他进行删除,以及他所附带的函数;并在os_cpu.h中注释点他们的外部声明;2:部分宏定义也删除了;


#if 0

#define  OS_CPU_CM3_NVIC_ST_CTRL    (*((volatile INT32U *)0xE000E010uL)) /* SysTick Ctrl & Status Reg. */

#define  OS_CPU_CM3_NVIC_ST_RELOAD  (*((volatile INT32U *)0xE000E014uL)) /* SysTick Reload  Value Reg. */

#define  OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018uL)) /* SysTick Current Value Reg. */

#define  OS_CPU_CM3_NVIC_ST_CAL     (*((volatile INT32U *)0xE000E01CuL)) /* SysTick Cal     Value Reg. */

#define  OS_CPU_CM3_NVIC_PRIO_ST    (*((volatile INT8U  *)0xE000ED23uL)) /* SysTick Handler Prio  Reg. */



#define  OS_CPU_CM3_NVIC_ST_CTRL_COUNT                    0x00010000uL   /* Count flag.                */

#define  OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC                  0x00000004uL   /* Clock Source.              */

#define  OS_CPU_CM3_NVIC_ST_CTRL_INTEN                    0x00000002uL   /* Interrupt enable.          */

#define  OS_CPU_CM3_NVIC_ST_CTRL_ENABLE                   0x00000001uL   /* Counter mode.              */

#define  OS_CPU_CM3_NVIC_PRIO_MIN                               0xFFu    /* Min handler prio.          */

#endif

#if 0

void  OS_CPU_SysTickHandler (void)

void  OS_CPU_SysTickInit (INT32U  cnts) 

#endif


os_cpu.h 同样把下面几个外部声明的函数给去掉;

#if 0

                                                  /* See OS_CPU_C.C                                    */

void       OS_CPU_SysTickHandler(void);

void       OS_CPU_SysTickInit(void);

                                                  /* See BSP.C                                         */

INT32U     OS_CPU_SysTickClkFreq(void); 

#endif


os_cpu_a.asm

这部分是汇编代码;由于他里面有部分指令集不适合stm32,所以我们要稍微改下:

1、将所有的PUBLIC 改为 EXPORT

2、把自己对齐部分也改下,也是因为指令集不匹配;

;       RSEG CODE:CODE:NOROOT(2)

AREA |.text|, CODE, READONLY, ALIGN=2

THUMB

REQUIRE8

PRESERVE8

注:AREA 一点不能顶头写,这是规定,不然回编译出错;


os_dbg.c

#define OS_COMPILER_OPT __root

这个不兼容,需要把它改下;

#define OS_COMPILER_OPT //__root


step three:

将ST的官方库导进去即可;


step four:

startup_stm32f10x_hd.s

将 PendSV_Handler 替换成 OS_CPU_PendSVHandler

stm32f10x_it.c

加头文件: ucos_ii.h,并添加如下代码:


/**

  * @brief  This function handles SysTick Handler.

  * @param  None

  * @retval None

  */

void SysTick_Handler(void)

{

OSIntEnter();

OSTimeTick();

OSIntExit();

}


os_cfg.h对部分功能进行剪裁;


#define OS_FLAG_EN0

#define OS_MBOX_EN 0

#define OS_MEM_EN 0

#define OS_MUTEX_EN 0

#define OS_Q_EN 0

#define OS_SEM_EN 0

#define OS_TMR_EN 0

#define OS_DEBUG_EN 0

#define OS_APP_HOOKS_EN 0

#define OS_EVENT_MULTI_EN 0


这样算是简单系统以及移植完成了,下面就是写自己的app了;我直接附上自己的main.c代码;


main.c



#include "stm32f10x.h"

#include "stm32f10x_conf.h"

#include "ucos_ii.h"

 

#define ON 1

#define OFF 0

#define LED1(opt) ((opt) ? (GPIOD->BRR |= 1<<3):(GPIOD->BSRR |= 1<<3))

#define LED2(opt) ((opt) ? (GPIOD->BRR |= 1<<6):(GPIOD->BSRR |= 1<<6))

#define LED3(opt) ((opt) ? (GPIOB->BRR |= 1<<5):(GPIOB->BSRR |= 1<<5))

 

#define SystemFrequency 72000000

#define STARTUP_TASK_PRIO 4

#define STARTUP_TASK_STK_SIZE 80

 

void SysTick_init(void)

{

SysTick_Config(SystemFrequency/OS_TICKS_PER_SEC);

}

 

void LED_Init()

{

RCC->APB2ENR |= (1<<3)|(1<<5);

GPIOB->CRL &= ~(0xff<<20);

GPIOB->CRL |= 0x33<<(4*5);

GPIOD->CRL &= ~(0xff<<(4*3));

GPIOD->CRL &= ~(u32)((u32)0xff<<(4*6));

GPIOD->CRL |= 0x33<<(4*3);

GPIOD->CRL |= 0x33<<(4*6);

LED1(OFF);

LED2(OFF);

LED3(OFF);

}

void TestLed1(void *p_arg)

{

SysTick_init();

while(1)

{

LED1(ON);

OSTimeDlyHMSM(0,0,1,0);

LED1(OFF);

OSTimeDlyHMSM(0,0,1,0);

}

}

void TestLed2(void *p_arg)

{

SysTick_init();

while(1)

{

LED2(ON);

OSTimeDlyHMSM(0,0,0,500);

LED2(OFF);

OSTimeDlyHMSM(0,0,0,500);

}

}

void TestLed3(void *p_arg)

{

SysTick_init();

while(1)

{

LED3(ON);

OSTimeDlyHMSM(0,0,0,100);

LED3(OFF);

OSTimeDlyHMSM(0,0,0,100);

}

}

static OS_STK task_testled1[STARTUP_TASK_STK_SIZE];

static OS_STK task_testled2[STARTUP_TASK_STK_SIZE];

static OS_STK task_testled3[STARTUP_TASK_STK_SIZE];

int main()

{

LED_Init();

OSInit();

OSTaskCreate(TestLed1,(void *)0,&task_testled1[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO);

OSTaskCreate(TestLed2,(void *)0,&task_testled2[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO-1);

OSTaskCreate(TestLed3,(void *)0,&task_testled3[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO-2);

OSStart();

return 0;

}


OK,到此为止,已经移植完成;我们就可以测试下;希望大家多多指教;后期继续深入学习ucosii的其他功能;

关键字:stm32  OS-II  ucosii移植 引用地址:【stm32+uC/OS-II】ucosii移植简单详细步骤

上一篇:【菜鸟入门】stm32 之 iic
下一篇:STM32CubeMonitor,可灵活支持多个操作系统

推荐阅读最新更新时间:2024-11-05 13:47

stm32中出现的hard_fault问题 如何解决
最近移植别人的一个lora程序,公司前任同事已经搞定的程序,从IAR平台移植到KEIL中,移植后,居然出现了hardfault问题。一直以来,我很少遇到这个问题,遇到了,也算是好事。 然后看看如何解决的吧。 1、单步执行,发现程序运行到哪的时候出现了hardfault问题。发现是初始化的时候。应该是结构体指针的初始化问题。 2、其实也从晚上找了一些如何定位hardfault的问题点的方法。充分利用call stack以及但不调试的工具。 3、问题点通常发生在数据越界,指针未初始化,堆栈溢出的这些情况。 method-1 试过它的方法,查看寄存器,利用反汇编,定位出问题点。http://bbs.ednchina.com/BLO
[单片机]
stm32delay函数怎么写
STM32的延时函数可以使用SysTick定时器来实现。SysTick定时器是一个24位的计数器,它可以在每个时钟周期自动减少计数值,直到计数值为0时触发中断。我们可以利用SysTick定时器的特性来实现精确的延时函数。 以下是一个实现延时函数的示例代码: #include stm32xxxx.h void SysTick_Handler(void) { // 在这里可以写一些需要周期执行的操作,但是要尽量保持简洁 } void delay_us(uint32_t us) { uint32_t ticks = us * (SystemCoreClock / 1000000); // 将微秒转换为滴答数 Sys
[单片机]
STM32串口中断方式接收
void RCC_Configuration(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); } 首先中断的配置 void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM,
[单片机]
STM32变量类型定义及延伸
注意:数据的运算可能会超过变量定义的类型 ,所以定义变量时要注意! STM32F4内的变量类型定义:在stdint中 /* exact-width signed integer types */ typedef signed char int8_t; typedef signed short int int16_t; typedef signed int int32_t;//在32位环境里,int代表4个字节32位 typedef signed __INT64 int64_t; /* exact-width unsigned integer types */ typedef
[单片机]
<font color='red'>STM32</font>变量类型定义及延伸
STM32通用定时器TIM2的使用方法解析
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。(TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器;TIM6和TIM7是基本定时器,其时钟由APB1输出产生) 本实验要实现的功能是:用普通定时器TIM2每一秒发生一次更新事件,进入中断服务程序翻转LED1的状态。 预备知识: ① STM32通用定时器TIM2是16位自动重装载计数器。 ② 向上计数模式:从0开始计数,计到自动装载寄存器(TIMx_ARR)中的数值时,清0,依次循环。 需要弄清楚的两个问题: 1
[单片机]
<font color='red'>STM32</font>通用定时器TIM2的使用方法解析
STM32——pwm控制LED
pwm.c #include pwm.h /******************************************************************************* * 函 数 名 : TIM3_CH1_PWM_Init * 函数功能 : TIM3通道1 PWM初始化函数 * 输 入 : per:重装载值 psc:分频系数 * 输 出 : 无 *******************************************************************************/ void TIM3_CH1_PWM_Init(u1
[单片机]
基于μC/OS-II嵌入式系统的低功耗开发
随着嵌入式系统应用的日益广泛,如何实现嵌入式系统的低功耗开发已经成为嵌入式应用发展的关键技术之一,是近几年来人们在嵌入式系统的设计中普遍关注的难点与热点。嵌入式系统正被广泛应用于移动性较强的产品中去,而这些产品不是一直有充足的电源供应,往往需要电池来供电,因此,设计人员需要从每一个细节来考虑降低系统的功率消耗,从各个方面去实现降低系统的功耗。同时功耗对终端设备的成本及体积大小有显著影响。 本文结合FM电台手持式测试仪这一实例,从系统硬件设计、系统软件设计、利用内核扩展接口和产品应用特点这四个方面深入地讨论了基于μC/OS-II嵌入式系统丌发中低功耗系统的设计。 1、嵌入式系统概述 1.1 嵌入式系统的定义 根据IEEE(国
[应用]
μC/OS-II在TMS320VC5402处理器上的移植
O 引言 TMS320VC5402处理器片内共有8条总线以及CPU、片内存储器和片外电路等硬件。该处理器具有低功耗、速度快,高度并行化等特点。 μC/OS-II是一种可移植、可固化、可剪裁及可剥夺型的多任务实时内核,适用于各种微处理器。μC/OS-II的源代码开放,所有代码均可采用ANSI的C语言编写,因而具有良好的可移植性,特别适用于对实时性要求较高的场合。 由于TMS320VC5402以及CCS编译器完全满足μC/OS-II的设计要求,因此,笔者在最小系统板上完成了对该实时内核的移植调试。 1 μC/OS-II在TMS320VC5402上的移植 图1所示是μC/OS-II的软硬件体系结构图。将内核移植
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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