嵌入式RTOS编程

目录

 一、实验任务

二、了解嵌入式实时操作系统

实时性

响应时间

实时操作系统组成

三、使用CubeMX建立STM32F103C8T6HAL库

创建新工程

配置环境

RCC

 SYS

 端口配置

串口配置

Clock Configuration

 Generate Code

 修改工程代码

 四、移植uC/OS-III

准备工作

移植工作

 为CPU添加文件

 为LIB添加文件

为PORT添加文件 

 为SOURCE添加文件

 为CONFIG添加文件

 为BSP添加文件

 导入文件路径​编辑

修改代码

设置工作

 初始化管脚

撰写主函数

编译工作

 烧录工作

五、总结

六、参考


 一、实验任务

学习嵌入式实时操作系统(RTOS),以uc/OS为例,将其移植到stm32F103上,构建至少3个任务(task):其中两个task分别以1s和3s周期对LED灯进行点亮-熄灭的控制;另外一个task以2s周期通过串口发送“hello uc/OS! 欢迎来到RTOS多任务环境!”。记录详细的移植过程。

二、了解嵌入式实时操作系统

嵌入式实时操作系统是一个特殊的程序,是一个支持多任务的运行环境。嵌入式实时操作系统最大的特点就是“实时性”,如果有一个任务需要执行,实时操作系统会立即执行该任务,不会有较长的延时。典型的实时操作系统有uCOS ,RT-Thread,FreeRTOS ,VxWorks,WinCE等。

嵌入式实时操作系统是一个特殊的程序(通常称为内核),它可以创建,销毁,控制所有任务。嵌入式实时操作系统除了包含一个内核以外,还提供其他服务,如文件系统,协议栈,图形用户界面等。本文的重点在于了解嵌入式实时操作系统内核的工作原理和结构,因此文中提到的实时操作系统通常指的是操作系统内核。实时操作系统内核通常要占用5%左右的CPU运行时间,另外内核是一个软件代码,需要额外占用ROM空间和RAM空间。

实时性


实时性可以定义为:触发条件产生后系统的反应能力。通俗的描述就是“天下武功唯快不破”,能达到所需要的“快”就是实时,在不同的场合需要达到us级、ns级。实时系统不仅仅只表现在“快”上,更主要的是实时系统需要对触发事件在限定时间内做出反应,这个限定时间是根据实际需要来定,例如自动驾驶控制系统的规定时间要求很短,需要在极短时间内做出动作;一些农业温度控制系统的规定时间要求比较长,需要温度控制平滑稳定。
 

响应时间

实时性越强,其响应时间越短。响应时间是指系统识别到一个事件到开始做出响应的时间。举一个简单的例子:一个工控设备有一个急停按键开关,用户希望按下急停开关的时候系统立即将停止所有的动作,假设用户在第1.001秒时按下了急停开关,软件系统在第1.011秒时执行了停止指令,工控设备相应的机械部件在1.211秒停止动作,此时软件系统响应时间为0.01秒,设备系统响应时间为0.21秒,设备系统的响应时间和软件系统的响应时间有一定区别,通常情况下设备系统的响应时间>软件系统的响应时间。本文中提到的响应时间指的是软件系统的响应时间。
 

实时操作系统组成

实时操作系由以下3个子系统组成(以uCOS和FreeRTOS为参考对象):
1、任务调度子系统
2、任务通信子系统
3、内存管理子系统

三、使用CubeMX建立STM32F103C8T6HAL库

创建新工程

配置环境

RCC

将hse设置为晶振

 SYS

 端口配置

设置PC13为GPIO_Output用于点亮LED灯

 

 

串口配置

USAR1

 

Clock Configuration

 Generate Code

如图设置,生成工程文件

 

 修改工程代码

找到生成的工程文件,使用keli打开

 

找到main.c,在主程序的while循环中添加如下代码

    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
  HAL_Delay(500);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
  HAL_Delay(500);

 

 四、移植uC/OS-III

准备工作


从ucoslll官网中下载源码
http://micrium.com/downloadcenter/

下载完成后自行新建 文件夹uC-BSP和uC-CONFIG

为uC-BSP文件夹新建bsp.c和bsp.h文件

 

将uCOS相关文件复制到HAL工程的MDK-ARM文件夹下

 

移植工作

 新建文件夹如下

 为CPU添加文件

 

 

 为LIB添加文件

 

 

为PORT添加文件 

 

 为SOURCE添加文件

 

 为CONFIG添加文件

 

 

 为BSP添加文件

 

 导入文件路径

 

修改代码

bsp.h

// b
### C++在嵌入式实时操作系统(RTOS)中的开发与应用 #### 1. 嵌入式系统的特点及其对C++的支持 嵌入式系统的开发通常受到资源有限性的约束,因此需要一种既能提供高效性能又能简化复杂逻辑的语言。C++作为一种兼具高层抽象能力和低层硬件操作能力的编程语言,在嵌入式领域得到了广泛应用[^1]。 尽管如此,由于嵌入式环境可能缺乏完整的标准库支持以及运行时环境(Runtime),开发者需特别注意如何适配这些限制条件。例如,`operator new`作为C++的一个核心特性,并不依赖于特定的标准库实现,而是通过编译器内置机制完成动态内存分配功能[^3]。这意味着可以通过自定义方式将其链接到RTOS所提供的堆管理接口上,从而适应不同的目标平台需求。 #### 2. FreeRTOS与C++ FreeRTOS是一个轻量级的开源RTOS解决方案,主要用于微控制器级别的设备开发。虽然它的官方文档更倾向于推荐使用纯C来进行编码工作,但实际上它同样允许采用C++编写应用程序代码[^2]。然而值得注意的是,在混合模式下可能会遇到一些额外的技术难题,比如名称修饰(name mangling),这要求程序员采取适当措施解决此类兼容性问题。 对于希望利用C++优势(如封装、继承和多态等OOP概念)的同时又想保持良好移植性和效率的团队来说,则需要仔细权衡两者之间的利弊关系并制定相应的策略。 #### 3. 自定义new/delete运算符以集成RTOS堆管理 为了使C++程序能够在没有传统C++ runtime的情况下正常运作,特别是当涉及到动态存储分配的时候,可以考虑重载全局版本的新建(`::operator new`) 和删除 (`::operator delete`) 运算符。这样做的目的是让它们调用由具体RTOS提供的相应服务而不是默认的行为: ```cpp void* operator new(std::size_t size) { void *p = pvPortMalloc(size); // 使用FreeRTOS的pvPortMalloc代替malloc() if (p == NULL){ throw std::bad_alloc(); } return p; } void operator delete(void* ptr) noexcept{ vPortFree(ptr); // 使用FreeRTOS的vPortFree代替free() } ``` 上述方法展示了如何将C++的对象创建过程绑定至指定RTOS框架下的内存池管理系统之上。此技术不仅有助于减少不必要的开销还能够增强整个软件栈的安全保障水平。 #### 4. 结合实例探讨——基于Raspberry Pi 的嵌入式Linux+C++开发 除了传统的裸机或者RTOS驱动型设计之外,现代许多高端MCU/SoC都开始转向搭载精简版的操作系统如μCLinux 或者完整内核形式的GNU/Linux 。在这种情况下,《Embedded Linux Primer》这类教材就显得尤为重要了[^5]。书中提到的内容涵盖了从启动加载程序配置直到构建定制化rootfs镜像的所有环节;而对于那些想要进一步探索高级话题的人群而言,“固件开发项目1000例”专栏里的相关内容无疑会成为极好的参考资料之一[^4]。 综上所述,无论是在经典的RTOS场景还是新兴的嵌入式linux生态当中,合理运用c++都能够显著提升项目的可维护性和扩展潜力。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值