RT-Thread是一个集实时操作系统(RTOS)内核、中间件组件和开发者社区于一体的技术平台,由熊谱翔先生带领并集合开源社区力量开发而成,RT-Thread也是一个组件完整丰富、高度可伸缩、简易开发、超低功耗、高安全性的物联网操作系统。RT-Thread 具备一个 IoT OS平台所需的所有关键组件,例如GUI、网络协议栈、安全传输、低功耗组件等等。经过11年的累积发展,RT-Thread 已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过4亿台,成为国人自主开发、国内最成熟稳定和装机量最大的开源RTOS。
RT-Thread 拥有良好的软件生态,支持市面上所有主流的编译工具如 GCC、Keil、IAR 等,工具链完善、友好,支持各类标准接口,如:POSIX、CMSIS、C++应用环境、Javascript 执行环境等,方便开发者移植各类应用程序。商用支持所有主流MCU架构,如 ARM,Cortex-M/R/A, MIPS, X86, Xtensa, C-Sky, RISC-V,几乎支持市场上所有主流的 MCU 和Wi-Fi 芯片。
最近初步了解了RT-Thread操作系统,在此记录下其基础操作。下面附上RT-Thread相关网址:
RT-Thread官网
RT-Thread文档中心
RT-Thread教学视频中心
初步认识
-
嵌入式操作系统是用来和上位机与硬件层对接的软件操作系统
-
RT-Thread 不仅是一个内核,还包含了众多组件,管理系统等
启动过程
-
systrmInit()
-
$Sub$$main()
-
rtthreadread_startup
- board初始化即硬件初始化
- rt_application_init();是用户任务创建函数
- rt_system_scheduler_start();让rtthread跑起来
- 使用$Super $ $ test()来替代原函数fun(),然后在$Sub $$ test()函数中调用它,便可以在函数前后添加自定义代码了,这样便能够达到在完全对原函数不做修改的情况下,在前后添加自己的代码。
-
rt_application_init()
-
main_thread_entry
-
$Super$$main(用户主函数)
动态内存堆的使用
-
rt_system_heap_init()中,起始地址一般为ZI结束段,结束地址为片内地址的最后一段。将这一段分配出来的空间作为动态内存空间
-
RT-Thread中内存的使用和裸机状态下的区别不大,只需要换掉对应的API就可以
-
内存复位:申请到新的内存空间后,将内存空间清零,内存在之前可能是其他程序的数据存储区
- P=rt_malloc(10);
如果申请成功
rt_memset(p,0,10)
- 内存泄漏:未释放已分配的动态内存
- 用rt_malloc申请后,用rt_free释放
-
rt_realoc在已分配的内存块基础上重新分配内存块大小,变大就扩展,变小就会将后面的数据截断
-
rt——calloc(rt_size_t count,rt_size_t size)从内存堆中分配连续内存地址的多个内存块
线程的创建
1.相关概念
-
线程代码(入口参数)
- 无限循环,需要有让出内存的动作
- 顺序执行
-
线程控制块
- 用于管理线程的一个数据结构,会存放线程的一些信息
-
线程堆栈
- 每个线程有独立的栈空间,线程切换时会将线程的上下文(线程执行时的环境)保存在线程栈中
2.线程创建
-
创建线程
-
rt_thread_init(创建的是静态线程,需要你告诉堆栈起始地址)
- const char *name为线程名字
void *parameter为线程代码
*parameter为线程(入口)参数
- const char *name为线程名字
-
rt_thread_create(创建的是动态线程,系统自动为你分配运行空间)
-
-
启动线程
- tr_thread_startup之后线程才受调度
3.静态线程和动态线程
-
相关资源分配形式
-
运行效率
- 没有外扩RAM,效率相同
- 有外扩RAM,如果动态线程是在外扩RAM中被分配的话,那它的运行速度就会下降,因为片内RAM运行速度大于片外RAM
创建LED流水灯线程
-
在thread_sample中创建线程函数
-
创建入口函数,必须要有让出CPU的操作,比如流水灯中的延时
-
将创建的线程函数放入main中
-
怎样分配栈空间大小
- 在调试界面下,用list_thread命令,查看当前所有线程状态,max used百分比为线程最大使用了你分配的栈空间,可以通过修改栈空间大小,一般将线程栈最大使用量设置为70%
- RT-Thread移植后与裸机 LED 闪烁应用代码的不同
- 延时函数不同: RT-Thread 提供的 rt_thread_mdelay() 函数可以引起操作系统进行调度,当调用该函数进行延时时,本线程将不占用 CPU,调度器切换到系统的其他线程开始运行。而裸机的 delay 函数是一直占用 CPU 运行的。
- 初始化系统时钟的位置不同:移植好 RT-Thread Nano 之后,不需要再在 main() 中做相应的系统配置(如 hal 初始化、时钟初始化等),这是因为 RT-Thread 在系统启动时,已经做好了系统时钟初始化等的配置,这在上一小节 “系统时钟配置” 中有讲解