【学习笔记】嵌入式操作系统RT-Thread基础操作

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教学视频中心

初步认识

  1. 嵌入式操作系统是用来和上位机与硬件层对接的软件操作系统

  2. RT-Thread 不仅是一个内核,还包含了众多组件,管理系统等

启动过程

  1. systrmInit()

  2. $Sub$$main()

  3. rtthreadread_startup

  • board初始化即硬件初始化
  • rt_application_init();是用户任务创建函数
  • rt_system_scheduler_start();让rtthread跑起来
  • 使用$Super $ $ test()来替代原函数fun(),然后在$Sub $$ test()函数中调用它,便可以在函数前后添加自定义代码了,这样便能够达到在完全对原函数不做修改的情况下,在前后添加自己的代码。
  1. rt_application_init()

  2. main_thread_entry

  3. $Super$$main(用户主函数)

动态内存堆的使用

  1. rt_system_heap_init()中,起始地址一般为ZI结束段,结束地址为片内地址的最后一段。将这一段分配出来的空间作为动态内存空间

  2. RT-Thread中内存的使用和裸机状态下的区别不大,只需要换掉对应的API就可以

  3. 内存复位:申请到新的内存空间后,将内存空间清零,内存在之前可能是其他程序的数据存储区

  • P=rt_malloc(10);
    如果申请成功
    rt_memset(p,0,10)
  1. 内存泄漏:未释放已分配的动态内存
  • 用rt_malloc申请后,用rt_free释放
  1. rt_realoc在已分配的内存块基础上重新分配内存块大小,变大就扩展,变小就会将后面的数据截断

  2. rt——calloc(rt_size_t count,rt_size_t size)从内存堆中分配连续内存地址的多个内存块

线程的创建

1.相关概念

  • 线程代码(入口参数)

    • 无限循环,需要有让出内存的动作
    • 顺序执行
  • 线程控制块

    • 用于管理线程的一个数据结构,会存放线程的一些信息
  • 线程堆栈

    • 每个线程有独立的栈空间,线程切换时会将线程的上下文(线程执行时的环境)保存在线程栈中

2.线程创建

  • 创建线程

    • rt_thread_init(创建的是静态线程,需要你告诉堆栈起始地址)

      • const char *name为线程名字
        void *parameter为线程代码
        *parameter为线程(入口)参数
    • rt_thread_create(创建的是动态线程,系统自动为你分配运行空间)

  • 启动线程

    • tr_thread_startup之后线程才受调度

3.静态线程和动态线程

  • 相关资源分配形式

  • 运行效率

    • 没有外扩RAM,效率相同
    • 有外扩RAM,如果动态线程是在外扩RAM中被分配的话,那它的运行速度就会下降,因为片内RAM运行速度大于片外RAM

创建LED流水灯线程

  1. 在thread_sample中创建线程函数

  2. 创建入口函数,必须要有让出CPU的操作,比如流水灯中的延时

  3. 将创建的线程函数放入main中

  4. 怎样分配栈空间大小

  • 在调试界面下,用list_thread命令,查看当前所有线程状态,max used百分比为线程最大使用了你分配的栈空间,可以通过修改栈空间大小,一般将线程栈最大使用量设置为70%
  1. RT-Thread移植后与裸机 LED 闪烁应用代码的不同
  • 延时函数不同: RT-Thread 提供的 rt_thread_mdelay() 函数可以引起操作系统进行调度,当调用该函数进行延时时,本线程将不占用 CPU,调度器切换到系统的其他线程开始运行。而裸机的 delay 函数是一直占用 CPU 运行的。
  • 初始化系统时钟的位置不同:移植好 RT-Thread Nano 之后,不需要再在 main() 中做相应的系统配置(如 hal 初始化、时钟初始化等),这是因为 RT-Thread 在系统启动时,已经做好了系统时钟初始化等的配置,这在上一小节 “系统时钟配置” 中有讲解
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值