移植uc/OS-III最新版到小熊派开发板(STM32L431)

发布者:BoldDreamer最新更新时间:2021-07-26 来源: eefocus关键字:移植  OS-III  STM32L431 手机看文章 扫描二维码
随时随地手机看文章

一、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!

关键字:移植  OS-III  STM32L431 引用地址:移植uc/OS-III最新版到小熊派开发板(STM32L431)

上一篇:STM32CubeMX | 35-使用硬件FSMC驱动TFT-LCD屏幕
下一篇:STM32WL芯片解锁方法

推荐阅读最新更新时间:2024-11-06 08:39

linux-3.0内核移植到fl2440开发板(以MINI2440为模板)
我们的fl2440开发板使用的是s3c2440的芯片,与MINI2440十分相似,因此需要改动的地方不多,移植也比较容易。 1. $ sudo tar -xjf linux-3.0.tar.bz2 2. 进入 linux-3.0,修改顶层Makefile 配置CPU类型和交叉编译器(195,196行) ARCH ?= arm CROSS_COMPILE ?= /opt/buildroot-2011.11/arm920t/usr/bin/arm-linux- 添加zImage头制作(559行后面) cp arch/arm/boot/zImage . -f /home/weishusheng/kernel/linux-3
[单片机]
μC/OS-II在LPC213X上的多种移植方案
μC/OS-II是可移植、适用于对安全性要求苛刻的剥夺型实时多任务嵌入式系统,简单易学,在工程应用和嵌入式系统教学中很受欢迎。LPC213X是 Philips公司推出的基于ARM7TDMI-S核的32位RISC微处理器,也适合于ARM学习开发平台和工程应用。 1 与μC/OS-II移植工作相关的主要特性 ARM体系结构分为7种运行模式,ARM和 Thumb两种工作状态。LPC213X的编程模型就是标准的ARM7体系结构;同时LPC213X也具备ARM的标准异常模式IRQ和FIQ。稍具特色的是其VIC向量中断控制器。分别对IRQ、FIQ、非向量中断和软件中断进行了分类,具有对32个中断输入的可编程分配机制。这对于μC/OS-
[单片机]
μC/OS-II在LPC213X上的多种<font color='red'>移植</font>方案
11-S3C2440驱动学习(五)嵌入式linux-网络设备驱动(二)移植DM9000C网卡驱动程序
我们实现了一个虚拟网卡驱动程序,现在我们针对真实的网卡芯片DM9000C,编写移植DM9000C网卡驱动程序。 一、移植分析 协议类的驱动,我们的主要工作往往是将现有的驱动和我们的硬件所匹配起来。协议类的函数往往已经成型不需要我们去修改和编写。比如发包函数:hard_start_xmit函数和netif_rx上报函数都不需要我们编写。网络驱动是针对很多硬件编写出来的,我们使用的是什么硬件CPU,比如ARM9,以及我们使用的系统版本。我们只需要修改驱动,告诉驱动现在的硬件情况是怎么样的,基地址是多少,中断引脚是哪个、设置下内存管理器以满足时序等等。这也是网络驱动移植的简单之处。 (1)DM9000C 一般一款网卡芯片,出
[单片机]
11-S3C2440驱动学习(五)嵌入式linux-网络设备驱动(二)<font color='red'>移植</font>DM9000C网卡驱动程序
SmartARM2200开发板的RedBoot的移植
引 言 eCos(embedded Configurable operating system)最初是由Cygnus Solutions公司为面向嵌入式领域而开发的实时操作系统,源码公开,具有很强的可移植性和可配置性,适合于嵌入式开发。现在eCos主要由 eCosCentric公司和eCos开源社区共同开发维护。eCos的特性,特别是它的可配置性,能有效缩短嵌入式产品的开发周期并降低成本。 RedBoot(Red Hat Embedded Debug and Bootstrap)是一个由Red Hat公司开发的可以在嵌入式系统上独立运行的引导程序。它是目前嵌入式领域功能最强大、可移植性最好的BootLoader之一,采用e
[单片机]
SmartARM2200<font color='red'>开发板</font>的RedBoot的<font color='red'>移植</font>
实时操作系统μC/OS-II在MCF5272上的移植
摘要:介绍了实时操作系统μC/OS-II的特点和内核结构,并首次实现μC/OS-II在Motorola嵌入式处理器MCF5272上的移值。 关键词:μC/OS-II MCF5272 移植 GNU工具链 作为一个实时内核,μC/OS从1992年开始为人们熟悉,到现在已经发展为μC/OS-II。ΜC/OS-II最多支持56个任务,其内核为占先式,总是执行就绪态的优先级最高的任务,并支持Semaphore(信号量)、Mailbox(邮箱)、Message Queue(消息队列)等多种常用的进程间通信机制。与大多商用RTOS不同的是,μC/OS-II公开所有的源代码,并可以免费获得,对商业应用收取少量License费用。一般商用操作系
[嵌入式]
uC/OS-II在ARM系统上的移植与实现
摘要: 使用ARM公司提供的ADS 开发工具,将uC/ OS - II 移植到ARM 处理器上,并将移植结果应用在跑马灯和数码管的实现上,运行正常,表明移植成功. 关键词 :uC/ OS - II ;ARM;移植 0  引言     在开发嵌入式系统时,一般选择基于ARM 和uC/ OS - II 的嵌入式开发平台,因为ARM 微处理器具有处理速度快、超低功耗、价格低廉、应用前景广泛等优点 . 将uC/ OS - II 移植到ARM 系统之后,可以充分结合两者的优势. 如果一个程序在一个环境里能工作,我们经常希望能将它移植到另一个编译系统、处理器或者操作系统上,这就是移植技术.移植技术可以使一种特定的技术在更加广泛的范围使用,使
[嵌入式]
OpenCV2.0.0移植到ARM9(五)(JZ2440----S3c2440)
Linux系统:Ubuntu9.10 交叉编译器:arm-linux-gcc-4.3.2(已安装) Qt:qt-x11-opensource-src-4.5.3.tar.gz qt-embedded-linux-opensource-src-4.5.3.tar.gz 1、安装Qt Qt下载地址:https://www.qt.io/download-open-source/ 这里下载的安装包为:qt-embedded-linux-opensource-src-4.5.3.tar.gz(大小123MB) 2、安装Qt-x11 将qt-x11-opensource-src-4.5.3.tar.gz包放到U
[单片机]
OpenCV2.0.0<font color='red'>移植</font>到ARM9(五)(JZ2440----S3c2440)
Blob在S3C44B0上的移植
引 言   Bootloader对于嵌入式设备来说至关重要,它涉及到许多硬件相关的知识。对于自制的嵌入式开发板,它又是不可跳过的步骤,所以很多人对于它感到很头痛。本文将以一款优秀的Bootloader Blob为例,详细讲解它的运行原理以及在S3C44B0通用处理器上的移植过程,为在嵌入式设备上的后续软件开发打下基础 。 1 Blob简介   Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。它遵循GPL,源代码完全开放。Blob既可以用来简单的调试,也可以启动Linux kernel。Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART(Linux A
[单片机]
Blob在S3C44B0上的<font color='red'>移植</font>
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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