历史上的今天
返回首页

历史上的今天

今天是:2025年07月26日(星期六)

正在发生

2021年07月26日 | 移植uc/OS-III最新版到小熊派开发板(STM32L431)

2021-07-26 来源:eefocus

一、uc/OS全家桶

Micrium Software提供了 RTOS 解决方案系列,俗称ucos全家桶,其中最为出名的就是 ucOS-II 和ucOS-III,于 2016 年成为 Silicon Labs 的一部分。

https://github.com/SiliconLabs

3. ucos内核选择

玩全家桶之前,肯定要先把RTOS内核玩起来,关于选择ucos-II还是ucos-III是个老生长谈的问题,上图解决:

4. uc/OS-III源码下载

uc/OS-III系统分为了三个开源仓库,要分别拉取。

① uC-OS3:

git clone https://github.com/SiliconLabs/uC-OS3.git1.

② uC-CPU:

git clone https://github.com/SiliconLabs/uC-CPU.git1.


③ uC-LIB:

git clone https://github.com/SiliconLabs/uC-LIB.git1.

二、移植前的准备

本文中使用的开发板为小熊派IoT开发板,主控为STM32L431RCT6:

本文使用的开发工具是MDK 5.30版本,编译器版本为ARMCC5。

移植之前使用STM32CubeMX生成一份裸机工程,保证可以使用printf在串口正常打印。

三、移植uc/OS-III

1. 复制ucos内核文件到工程中

这里我全都复制过来,后续可以将未添加到MDK中的文件删除。

在工程下新建 ucOS-III 文件夹,存放ucOS-III相关文件。

① 复制ucos内核文件夹过来:

② 复制uC-CPU和uC-LIB两个文件夹过来:

2.添加文件到MDK工程

① 添加 ucos-iii/ports 分组,添加 PortsARM-Cortex-MARMv7-M 目录下的os_cpu_c.c文件,以及该目录下ARM目录下的os_cpu_a.asm文件和 os_cpu_c.c文件:

② 添加 ucos-iii/source分组,添加Source文件夹下的所有c文件(除去__dbg_uCOS-III.c):

③ 添加uC-LIB分组,添加uC-LIB文件夹下的4个c文件:

④ 添加uC-CPU分组,添加uC-CPU下的相关文件,如图:

⑤ 添加 ucos-iii/config 分组,添加配置文件,如下:

  • lib_cfg.h:uC-LIBCfgTemplate

  • os_cfg.h:CfgTemplate

  • cpu_cfg.h:uC-CPUCfgTemplate

3. 添加头文件路径到工程中

4. 修改配置文件

① 修改 cpu_cfg.h,配置本工程所使用内核中CPU的NVIC优先级位数:

② 修改 os_cfg.h,关闭系统中 APP HOOKS 功能:

5. 处理中断

RTOS中内核得以运行需要两个中断:


在pendSV异常处理中进行任务切换

在systick异常处理中进行内核时钟处理

首先包含进来ucos的头文件,修改 stm32l4xx_it.c 文件,在头文件添加:


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include "os.h"

/* USER CODE END Includes */


① 处理pendSV异常,如下:


/**

  * @brief This function handles Pendable request for system service.

  */

void PendSV_Handler(void)

{

  /* USER CODE BEGIN PendSV_IRQn 0 */

   OS_CPU_PendSVHandler();


  /* USER CODE END PendSV_IRQn 0 */

  /* USER CODE BEGIN PendSV_IRQn 1 */


  /* USER CODE END PendSV_IRQn 1 */

}


② 处理Systick异常,如下:


/**

  * @brief This function handles System tick timer.

  */

void SysTick_Handler(void)

{

/* USER CODE BEGIN SysTick_IRQn 0 */

/* USER CODE END SysTick_IRQn 0 */

HAL_IncTick();

/* USER CODE BEGIN SysTick_IRQn 1 */

OS_CPU_SysTickHandler();

/* USER CODE END SysTick_IRQn 1 */

}


至此,移植完成。


四、测试系统调度和延时

在main.c中按照如下过程编写测试代码。


① 引入ucos头文件:


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include

#include "os.h"

/* USER CODE END Includes */


② 定义任务栈、任务控制块、任务入口函数:


/* Private variables ---------------------------------------------------------*/


/* USER CODE BEGIN PV */

static  OS_TCB   Task1TCB;

static  CPU_STK  Task1Stk[512];


static void Task1_entry(void *p_arg)

{

OS_ERR  err;

    

(void)p_arg;

  

while(1)

{

        printf("task1 is running...rn");

    OSTimeDly(1000, OS_OPT_TIME_DLY, &err);

}   

}



static  OS_TCB   Task2TCB;

static  CPU_STK  Task2Stk[512];


static void Task2_entry(void *p_arg)

{

OS_ERR  err;

    

(void)p_arg;

  

while(1)

{

        printf("task2 is running...rn");

    OSTimeDly(1000, OS_OPT_TIME_DLY, &err);

}   

}



/* USER CODE END PV */


③ 在main函数中定义错误值变量:


  /* USER CODE BEGIN 1 */

    OS_ERR  err;

  /* USER CODE END 1 */


④ 在main函数中初始化内核、创建两个任务、启动内核:


/* USER CODE BEGIN 2 */

printf("uc/OS-III Port On BearPi Board By Mculover666rn");


/* 初始化 uc/OS 内核 */

OSInit(&err); 


/* 创建task1 */

OSTaskCreate((OS_TCB       *)&Task1TCB,         //任务控制块指针           

             (CPU_CHAR     *)"Task 1",          //任务名称

             (OS_TASK_PTR   )Task1_entry,       //任务入口函数

             (void         *)NULL,              //任务入口函数的参数

             (OS_PRIO       )2,                 //任务优先级

             (CPU_STK      *)&Task1Stk[0],      //任务栈地址

             (CPU_STK_SIZE  )512 / 10,          //任务栈监测区大小

             (CPU_STK_SIZE  )512,               //任务栈大小

             (OS_MSG_QTY    )0,                 //任务支持接受的最大消息数

             (OS_TICK       )0,                 //时间片 */

             (void         *)0,                 //堆栈空间大小  

             (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),

 /*

OS_OPT_TASK_STK_CHK      使能检测任务栈,统计任务栈已用的和未用的

OS_OPT_TASK_STK_CLR      在创建任务时,清零任务栈

 */  

             (OS_ERR       *)&err);


/* 创建task2 */

OSTaskCreate((OS_TCB       *)&Task2TCB,   

             (CPU_CHAR     *)"Task 2",

             (OS_TASK_PTR   )Task2_entry,

             (void         *)0,

             (OS_PRIO       )3,

             (CPU_STK      *)&Task2Stk[0],

             (CPU_STK_SIZE  )512 / 10,

             (CPU_STK_SIZE  )512,

             (OS_MSG_QTY    )0,

             (OS_TICK       )0,

             (void         *)0,

             (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),

             (OS_ERR       *)&err);


/* 启动内核 */

OSStart(&err);


(void)&err;


/* USER CODE END 2 */


⑤ 编译,下载,在串口助手中查看输出:




接下来就可以愉快的去玩uc/OS-III内核啦~还可以玩玩全家桶,go go go!

推荐阅读

史海拾趣

CITIZEN公司的发展小趣事

进入21世纪,西铁城公司在技术创新方面继续取得显著进展。其中,光动能技术的开发是公司历史上的一大里程碑。1995年,西铁城推出了第一只光动能手表,这一技术能够吸收任何可见光源并转化为动能,为腕表提供持续的动力。随后,公司不断对光动能技术进行改进和优化,使其更加精确、高效。这一技术的成功应用,不仅提升了西铁城产品的竞争力,也为整个电子行业带来了新的发展方向。

GHI Electronics公司的发展小趣事

为了满足不同客户的多样化需求,GHI Electronics不断拓展其产品线。除了传统的电子元件和模块外,公司还开始涉足智能家居、物联网等新兴领域。通过不断引入新技术、新产品,GHI Electronics成功实现了从单一产品向多元化产品线的转变。这种转变不仅丰富了公司的产品线结构,也提高了公司的综合竞争力。

璟德(ACX)公司的发展小趣事

2008年,璟德(ACX)成功在台北证券交易所上市,股票代码为3152。这一举措为公司带来了更多的资金支持,也提升了其品牌影响力和市场地位。上市后,璟德(ACX)加大了对研发和市场拓展的投入,进一步巩固了其在无线通信领域的领先地位。

Circuit Technology Inc公司的发展小趣事

随着市场竞争的加剧,CTI意识到品质管理对于企业发展的重要性。于是,公司开始引进先进的品质管理体系,从原材料采购到生产流程控制,再到产品检测,每一个环节都严格把关。同时,CTI还加大了品牌宣传力度,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。这些举措不仅提高了产品的品质稳定性,也赢得了客户的信赖和支持。

飞翼科技(FEIYI)公司的发展小趣事

Circuit Technology Inc(以下简称CTI)自创立之初,便致力于电路技术的研发与创新。在成立初期,公司凭借其独特的电路设计技术,成功开发出一款高效能、低成本的电路板,迅速在行业内崭露头角。随着技术的不断完善和市场的逐步认可,CTI的产品逐渐占据了市场份额,公司规模也逐渐扩大。为了进一步拓展市场,CTI积极与国内外知名企业合作,共同开发新产品,不断提升自身的技术水平和市场竞争力。

DURATOOL公司的发展小趣事

人才是企业发展的第一资源。DURATOOL公司一直高度重视人才的培养和引进。公司建立了一套完善的人才选拔和培养机制,通过内部培训、外部招聘等方式不断吸纳优秀人才加入公司。同时,公司还为员工提供了广阔的发展空间和良好的福利待遇,激发了员工的积极性和创造力。这些举措使得DURATOOL公司拥有一支高素质、专业化的员工队伍,为企业的发展提供了有力的人才保障。

问答坊 | AI 解惑

问一下关于放大器的偏置电路

file:///C:/Documents%20and%20Settings/Administrator.4797A7AA28774FE/桌面/未命名.bmp请问这个电路中电感RFC和电容Cbypass值应如何计算,假如放大器的输出频率为5000MHz…

查看全部问答>

[求助]多点温度检测系统

如谁有这方面的材料的   请发给我一下可以么?不一定符合下面的要就的,关于多点温度检测系统的都可以发给me,设计一个多点温度检测系统,系统结构框图如下  : 温度测点1→   →  检测器单元1    ...…

查看全部问答>

如何修改VXWORKS的启动标题

VXWORKS启动时超级终端会打印以下信息: Copyright 1984-1998  Wind River Systems, Inc.             CPU: Motorola ADS - PowerPC 860         VxWorks: 5.4 ...…

查看全部问答>

make问题,如何解决? 困扰很久了,感谢指点

    在嵌入式系统上做Qt串口显示程序 ,make后出现的问题,查了一些资料,有的说是pro里面的HEADERS忘记加就会出现这个问题(具体加什么没说);有的说是出现“undefined reference”表示你缺少*.h        困扰很 ...…

查看全部问答>

vxWorks寄存器读写问题

我现在写不了某些寄存器(就I2C寄存器写不进去,其他都可以) 有遇见这种问题的么? 我是关了MMU的啊~ 情况如下: 我在shell中输入 查看内存0x55000000位置的寄存器。 d 0x55000000 55000000:  0100 0000 0000 0000 0000 0000 00 ...…

查看全部问答>

求购 S3C4510B 的开发板 (二手也可以)

求购 S3C4510B 的开发板 最近找了份4510b的资料,看着不错可惜没有板子练。真是郁闷啊!不知道哪为高手还有收藏! 有的话留个言! 电话:13141280460 qq:406672875…

查看全部问答>

额定电流估算口诀

已知电机功率,如何估算电机的额定电流? 三相二百二电机,千瓦三点五安培。 三相三百八电机,一个千瓦两安培。 三相六百六电机,千瓦一点二安培。 三相三千伏电机,四个千瓦一安培。 三相六千伏电机,八个千瓦一安培。 3KW以下,1个KW,2.5个流…

查看全部问答>

2812的eCAN模块问题

在自测试模式下,想实现从邮箱1发数据给邮箱3,但是运行程序发现TRS寄存器不能置位,信息发不出去,不知道怎么回事。 有没有人遇到过类似情况呢? 程序如下 void InitECan(void) { struct ECAN_REGS ECanaShadow; EALLOW; / ...…

查看全部问答>

[求教]TMS320C5416串口疑问,被卡住很久了!

学习C5416已经很久了,但是进度非常的慢,一个人盲打莽撞。 最近又碰上了个卡了很久的问题:     想用一个串口实现同时输入输出,因为C5416是全双工的。我用5416与TLV2541和TLV5636相接实现信号的输入与输出。     5416一个 ...…

查看全部问答>

The embedded system of the analog design

好书适合数字工程师了解的模拟知识   本书为那些希望掌握基本模拟知识的数字工程师而写,内容包括A/D转换器、D/A转换器、运放、滤波器以及模拟和数字系统集成设计。  本书特别适合那些从事信息家电、工业控制和机电控制系统等模拟/数字 ...…

查看全部问答>