硬件平台
cw32_48f大学计划板
cw32_iot_eva物联网开发评估套件
rt-thread nano
rt-thread nano 是一个极简版的硬实时内核,它是由 c 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 rtos。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用于家电、消费电子、医疗设备、工控等领域大量使用的 32 位 arm 入门级 mcu 的场合。
下图是 rt-thread nano 的软件框图,包含支持的 cpu 架构与内核源码,还有可拆卸的 finsh 组件:
支持架构:arm:cortex m0/ m3/ m4/ m7 等、risc-v 及其他。
功能:线程管理、线程间同步与通信、时钟管理、中断管理、内存管理。
rt-thread nano的特点
下载简单
rt-thread nano 以软件包的方式集成在 keil mdk 与 cubemx 中,可 以直接在软件中下载 nano 软件包获取源码,获取方式详见 基于 keil mdk 移植 rt-thread nano 与 基于 cubemx 移植 rt-thread nano 。同时也提供 下载 nano 源码压缩包 的途径,方便在其他开发环境移植 rt-thread nano,如 基于 iar 移植 rt-thread nano。
代码简单
与rt-thread 完整版不同的是,nano 不含 scons 构建系统,不需要 kconfig 以及 env 配置工具,也去除了完整版特有的 device 框架和组件,仅是一个纯净的内核。
移植简单
由于 nano 的极简特性,使 nano 的移植过程变得极为简单。添加 nano 源码到工程,就已完成 90% 的移植工作。
使用简单
rt-thread nano 在使用上也非常简单,带给开发者友好的开发体验。
易裁剪:nano 的配置文件为 rtconfig.h,该文件中列出了内核中的所有宏定义,有些默认没有打开,如需使用,打开即可。具体的配置可见 nano 版块的 rt-thread nano 配置 教程。
易添加 finsh 组件:finsh 组件 可以很方便的在 nano 上进行移植,而不再依赖 device 框架,只需要对接两个必要的函数即可完成 finsh 移植。
资源占用小:对 ram 与 rom 的开销非常小,在支持 semaphore 和 mailbox 特性,并运行两个线程 (main 线程 + idle 线程) 情况下,rom 和 ram 依然保持着极小的尺寸,ram 占用约 1k 左右,rom 占用 4k 左右。
注:如果需要丰富的组件、驱动以及软件包等功能,则建议使用 rt-thread 完整版。
移植过程
打开一个支持串口printf打印的工程模板
打开manage run-time environment工具,选择rt-thread,我们这里只选择kenel。
打开rtos目录下的board.c文件,添加main.h头文件的引用、添加系统心路中断函数、添加systick初始化。
打开rtthconfig.h中内存管理的选项
注释掉interrupts_cw32放0.c中hardfault_handler、pendsv_handler两个函数,避免出现得新定义的错误
注释掉cw32f030_systick.c中的systick_handler函数,避免出现得新定义的错误
在main.c中添加rtthreah.h的头文件引用,再添回两个任务函数,并在主程序中启动
#include main.h
#include
//常用头文件放置main.h
struct rt_thread thread1;
struct rt_thread thread2;
char thread1_stack[512];
char thread2_stack[512];
void thread1_entry(voidparam)
{
while (1)
{
printf(thread1 is runningrn n);
rt_thread_mdelay(500);
}
}
void thread2_entry(voidparam)
{
while (1)
{
printf(thread2is runningrn n);
rt_thread_mdelay(3000);
}
}
void thread1_init(void)
{
rt_err_t fd=rt_thread_init(&thread1,thread1,
&thread1_entry,0,
&thread1_stack[0],
sizeof(thread1_stack),10,10);
if(fd < 0)
{
printf(thread1 init is fail rn n);
}
else
{
printf(thread1init is success rn n);
}
rt_thread_startup(&thread1);
}
void thread2_init(void)
{
rt_err_t fd=rt_thread_init(&thread2,thread2,
&thread2_entry,0,
&thread2_stack[0],
sizeof(thread2_stack),10,10);
if(fd < 0)
{
printf(thread2 init is fail rn n);
}
else
{
printf(thread2init is success rn n);
}
rt_thread_startup(&thread2);
}
int32_t main(void)
{
rcc_configuration(); //时钟配置64m,时钟配置以移动到systejm_cw32f030.h
uart_configuration();//printf函数初始化,函数主体在debug.c,使用串口1,和大学板的led3冲突。
thread1_init();
thread2_init();
printf(cw32f030-rtthread init n);
while(1)
{
}
}
测试效果
移植可能还有问题,只是初步移植,目前能串口打印,但是我感觉串口打印有乱七八糟码,而且打印速度非常快,可能这个部分有问题,后面看看能否移植finsh组件。
数字音频 声音的基础知识
javascript可以关闭吗
PCB的历史及发展趋势
实现RS232转PROFIBUS的功能
增距镜作用及三省是什么?
国产MCU-CW32F030开发学习—移植rtthread-nano
Uber无人车再起波澜,载人发生撞车事故,严重堪比特斯拉车祸致死
酷栈科技xView,不只是比肩传统PC的全能体验
住进3D打印建筑是什么感觉?
i2c总线协议标准与规范
息屏显示会缩短续航时间吗?
大功率二极管主要参数_大功率二极管特性_常用大功率二极管及特点
从SR820工业路由器看未来AGV车辆的发展趋势
智能语音助手将成为智能家居用户入口
测量各类非电物理量的4~20mA电流环采集应用方案
引进华润12寸晶圆生产线项目,与博世集团共建工业4.0创新技术中心
“一点”也不能忍 | 精准检测让屏幕缺陷无所遁形
我们将来可能会看到可折叠的iPhone
制动防抱死系统(ABS)工作原理解析
数码相机充电电池使用需要注意的问题和事项