RT-thread中的编程思想

RTOS编程思想简述

实时系统简介

  • 实时操作系统
    系统的实时性是在指定的时间内对事件做出响应,对于一些裸机程序,后台程序是在while主程序中轮询执行,前台程序是由中断控制,可以满足一些对时间要求不高的设备场景,但是对于一些对事件控制要求较高的场合就不适用了。那么此时我们的多线程系统就可以发挥作用,相比于裸机程序,我们把这些程序主体分为一个一个的独立的小程序,可以实现任务调度,以及抢占。

  • 实现系统的特点

  1. 时间约束
  2. 可预测
  3. 可靠
  4. 与外界交互(等待外界触发)
  • 软定时与硬定时
  1. 软定时

可以在规定时间内出现一定的偏差延时,对系统功能干扰不大

  1. 硬定时

必须严格限定时间,时间的偏差对系统功能有较大影响

嵌入式系统 ≠ 实时系统

rtos中的面向对象编程

  • 面向对象编程
    面向对象编程与结构化设计实际上就是一种自底向上的编程,下一层的代码写好之后封装好,留出相应的api接口,上一层可以直接调用继承,极大的减少了代码的编写量,提高了代码的复用率,同时上层在调用下一层的代码的时候还可以对其进行改造,重新封装,供其他地方使用,我们的一般类,称之为基类,继承之后改造拓展之后称之为派生类或者特殊类。

  • 模块化编程

    减少代码的冗余,提高代码复用率,以及安全可靠性,减小bug的产生

  • 在RT-thread中的一些对象

rt_objecet是所有内核对象的基类

struct rt_object
{
    char       name[RT_NAME_MAX];                       /**< name of kernel object */
    rt_uint8_t type;                                    /**< type of kernel object */
    rt_uint8_t flag;                                    /**< flag of kernel object */

#ifdef RT_USING_MODULE
    void      *module_id;                               /**< id of application module */
#endif
    rt_list_t  list;                                    /**< list node of kernel object */
};

其他的一些类都是从此基础上发展而来的子类或者派生类,之后再从这些类中发展新的类,增强代码的耦合性,自底向上发展

前后台系统

对于我们在裸机中的程序,后台系统就是在主程序中一直循环的执行的任务,轮询执行,前台系统则是一些中断,通过触发中断来执行相应的操作。但是在复杂的程序中,前后台系统并不可靠,系统的实时可靠性低下。

嵌入式实时操作系统

多线程多任务

在RT-thread中,线程的切换是抢占式的,线程的优先级越高抢占的能力越强,优先级高线程抢占优先级低的线程来执行,当优先级高的线程执行完毕,优先级低的线程再执行。在调度器切换线程时,线程挂起,线程的上下文保存在线程栈中,线程恢复运行时读取上下文。(线程控制块+线程栈 = 一个线程的运行环境)

线程管理
  • 线程的优先级与时间片

线程最大支持256个优先级,0为最小优先级,空闲线程是最小优先级,该线程永远不可被挂起,可以在空闲线程钩子里执行一些操作监测系统是否正常执行。空闲钩子函数里面测量系统的空闲时间,调度器钩子函数可以查看当前线程的切换状态。时间片是当两个线程的线程优先级相同时才起作用,两个线程会根据时间片的长短在cpu中来回切换。

  • 静态线程与动态线程

动态线程的线程控制块,栈空间大小都由系统自动分配
静态线程的线程控制块,栈空间大小由用户自己分配

  • 线程的删除与退出

在rtthread中支持线程执行完毕后自动退出,也可以调用相应的api来删除线程,当线程执行完毕自动退出,线程自动设置为初始态。

线程的设计与开发、

在设计线程时应该着重考虑线程栈的大小以及线程的优先级,线程栈的大小在设计时可以先给一个较大的值,之后通过finsh组件查看当前线程栈的使用情况,一般是在70%左右即可。同时线程的优先级也应当遵循相应的原则,运行时间长的线程的优先级应较低,对实时性,功能要求较高的线程优先级应较高

线程调度算法

rtthread的调度算法是基于优先级调度与时间片轮转调度共存,同一优先级下可以存在多个线程。不同线程的优先级和时间片可能相同也可能不同,可以通过优先级抢占以及时间片轮转运行。

定时器,链表与线程调度

线程的链表节点 tlist – 双向链表
线程就绪列表 thread_priority_table
就绪链表 ready list 将该线程放在就绪链表最后面 rt_list_insert_before 运行之后挂起,将该线程放入链表尾部,找出链表中的第一个thread运行
rt_system_scheduler_start — > _get_highest_priority_thread --> rt_hw_context_switch_to
线程调用 rt_thread_startup来启动线程,在这个函数中调用rt_thread_resume来将线程根据优先级放入线程就绪列表ready list,每次执行的线程是在就绪列表中排在第一的线程
线程创建的时候会初始化一个内置定时器,每发生一次tick中断,会检查线程是否超时,当定时时间超时,就会将该线程唤醒

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值