历史上的今天
返回首页

历史上的今天

今天是:2025年03月04日(星期二)

正在发生

2020年03月04日 | 【stm32+uC/OS-II】ucosii移植简单详细步骤

2020-03-04 来源:eefocus

μ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的其他功能;

推荐阅读

史海拾趣

福建国光公司的发展小趣事

对于具有锁定功能的物体检测报警电路,网友可能会有多种问题,以下是一些常见问题及其回答:

一、电路工作原理相关问题

  1. 问题:具有锁定功能的物体检测报警电路是如何工作的?
    回答:该电路通常包括光电检测部分、信号处理部分和报警输出部分。当有人或物体入侵到光电检测的空间时,光被遮挡,导致光敏晶体管截止,其集电极电压上升。这一变化被信号处理部分检测并转换为控制信号,使报警电路启动,发出声音或光等报警信号。同时,电路具有锁定功能,即一旦报警触发,需要特定操作(如断开开关)才能解除报警状态。

  2. 问题:锁定功能是如何实现的?
    回答:锁定功能通常通过记忆电路或状态保持电路实现。当报警信号被触发后,这部分电路会保持一个高电平或低电平状态,使报警信号持续输出,直到接收到解除报警的外部信号(如断开开关)。这种设计可以防止短暂的遮挡或误触发导致的短暂报警,提高系统的稳定性和可靠性。

二、电路设计与实现相关问题

  1. 问题:在设计具有锁定功能的物体检测报警电路时,需要考虑哪些因素?
    回答:设计时需要考虑的因素包括检测灵敏度、报警响应时间、误报率、功耗、成本以及与其他系统的兼容性等。此外,还需要考虑电路的稳定性、可靠性和安全性,确保在各种环境条件下都能正常工作。

  2. 问题:如何降低电路的误报率?
    回答:降低误报率的方法包括优化光电检测器的布局和参数设置,以减少外界光线的干扰;采用信号处理算法对检测信号进行滤波和去噪处理;以及设置合理的报警阈值等。此外,还可以通过增加确认机制(如二次检测)来进一步降低误报率。

三、电路应用与维护相关问题

  1. 问题:这种电路在哪些领域有应用?
    回答:具有锁定功能的物体检测报警电路在多个领域都有广泛应用,如安防监控、工业自动化、智能家居等。在安防监控领域,它可以用于入侵检测、门窗防护等场景;在工业自动化领域,可以用于生产线上的物料检测、机器人避障等场景;在智能家居领域,则可以用于门窗传感器、人体存在检测等场景。

  2. 问题:如何对电路进行日常维护和故障排查?
    回答:日常维护包括定期检查电路的连接是否牢固、光电检测器是否清洁无遮挡等。故障排查时,可以使用万用表等工具检测电路各部分的电压和电流是否正常,定位故障点。同时,也可以结合报警记录和监控视频等信息进行综合分析,以快速准确地判断故障原因并采取相应的解决措施。

以上是针对具有锁定功能的物体检测报警电路可能提出的问题及其回答。需要注意的是,由于电路的具体设计和实现方式可能因应用场景和需求的不同而有所差异,因此在实际应用中还需要根据具体情况进行调整和优化。

City_Technology公司的发展小趣事

为了进一步推动公司的发展,City Technology于1993年决定售出部分股份,并在1996年成功在伦敦股票交易所上市。这一举措为公司带来了更多的资金支持,也为其后续的资本运作和战略扩张提供了可能。上市后的City Technology在资金、人才和市场资源等方面得到了极大的提升,为其日后的快速发展奠定了坚实的基础。

Electric Imp Inc.公司的发展小趣事

在物联网设备管理平台的基础上,Electric Imp Inc.公司不断推动技术创新。公司研发团队经过数年的努力,成功研发出了一款基于边缘计算的物联网设备。这款设备具有更高的数据处理能力、更低的延迟和更好的安全性,能够满足更广泛的应用场景。这一技术突破使得公司在物联网领域的技术实力得到了显著提升。

Diotec Electronics Corp公司的发展小趣事

在竞争激烈的电子行业中,Diotec始终保持对技术创新的追求。公司不断增加研发投入,引进先进的研发设备和人才,积极开发具有自主知识产权的新产品。这些新产品不仅丰富了公司的产品线,还进一步巩固了公司在市场中的领先地位。同时,Diotec还注重知识产权保护,通过申请专利等方式保护自己的创新成果。

CLANDELL公司的发展小趣事

CLANDELL公司初创时,市场上已有众多成熟的电子产品制造商。面对激烈的竞争,CLANDELL公司创始人凭借对技术的敏锐洞察和对市场的深入理解,决定专注于研发高性能、高可靠性的电子产品。初创期资金匮乏,但团队凭借对技术的执着和对市场的信念,不断攻克技术难关,逐步在市场上站稳脚跟。

Califia Lighting公司的发展小趣事

在环保理念日益深入人心的背景下,Califia Lighting积极响应国家号召,致力于推动绿色照明技术的发展。公司研发了一系列环保型LED产品,降低了能源消耗和环境污染。同时,公司还关注未来照明技术的发展趋势,不断探索新的应用领域和市场机会,为公司的可持续发展奠定了坚实基础。

通过以上五个故事,我们可以看到Califia Lighting公司在电子行业里发展起来的艰辛与辉煌。他们凭借技术创新、市场拓展、品质管理和绿色发展等方面的不断努力,逐渐成为了电子照明行业的佼佼者。

问答坊 | AI 解惑

青越锋·PCBDOC模块

特点:完善的设计规则设置,确保PCB设计符合要求 更加方便、快捷的层堆栈管理 超强的元器件布局功能 更加快捷的网络编辑功能 绝对畅快的焊盘处理功能 多重选择功能 可靠的设计规则检查 面向用户的PCB工作区 丰富的输出功能 完全可控的PCB打印…

查看全部问答>

嵌入式

求直流电机应用程序源码和vcw文件…

查看全部问答>

WinCe FindWindow函数无法打开窗口

我的程序是: void CBrowserDlgDlg::OnButton1() {         // TODO: Add your control notification handler code here          // TODO: Add your control notification handler code h ...…

查看全部问答>

服务器的scsi/raid驱动不安装,影响性能吗?就一个硬盘

现在我有一台服务器,之前安装的linux,没有管驱动的事情,现在改给windows,提示scsi/raid控制器的驱动没有安装, 我从网上查了一下说是支持磁盘阵列的问题,想问一下大家,我现在就一个硬盘,不安装可以吗?影响服务器的运行速度吗?…

查看全部问答>

单片机读写sd卡

最近想试试用单片机读写sd卡,所以想问一下谁有sd卡的模块的电路图,想diy一个。。…

查看全部问答>

LCM-LCD

本产品为4行16列字符形显示模块,可以显示中文、英文、俄文、日文、韩文等,工作电压有3V和5V两种。 蓝色LCD,白色侧背光。12点视角。 视窗25mmX62mm   QQ:625866132 欢迎交流!合作! 字符形模块 [ 本帖最后由 tonnyy 于 2010-12- ...…

查看全部问答>

【TI原创】基于LM3S8962的网络收音机(六) --- 网络存储播放MP3

上一篇已经做好了PC端的测试程序,用来读写音频文件,并通过网路传输,这篇主要完成: 1.      LM3S8962通过网络接收PC端的数据; 2.      存储数据到SD卡中 3.    &nbs ...…

查看全部问答>

opencore 的can 核在sopc编译有问题

生成ip核没问题,编译生成原理图时,提示有问题。 Error: cpu/instruction_master: Base Address for can_control/arbitration_lost_capture_reg must be a multiple of its span 0x4.Error: cpu/instruction_master: Base Address for can_contro ...…

查看全部问答>

Windows Phone 8 发布

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 …

查看全部问答>