RT-Thread内核

1. 嵌入式系统

嵌入式系统是一种完全嵌入在装置或设备内部,为满足特定需求而设计的计算机系统,生活中常见的嵌入式系统有:电视机机顶盒、路由器、电冰箱等等。
嵌入式操作系统是应用于嵌入式系统的软件,他用来对接嵌入式底层硬件与上层应用。嵌入式操作系统在多任务任务管理、任务间通信、内存管理、定时器管理、设备管理等方面,提供给了用户一套完整的机制,极大程度上便利了嵌入式应用程序的开发,管理和维护。

2. 认识RTT操作系统

RTT与其他RTOS(FreeRTOS、uC/OS)的主要区别是:RT-Thread自创建之初的定位就不是仅仅是一个RTOS内核,而是包含网络、文件系统、GUI界面等组件的中间件平台,具有极强的扩展性。

(1)RT-thread的系统启动过程

  1. SystemInit()
  2. S u b Sub Sub$main()
  3. rttread_startup()
  4. rt_application_init()
  5. main_thread_entry()
  6. S u p e r Super Super$main 用户主函数

3.动态内存堆的使用

栈(stack):由编译器自动分配释放
堆(heap):一般由程序员分配和释放

int a = 0;全局初始化区
char *p1;全局未初始化区 
main(){
int b;
char s[] = "abc";栈
p1=(char *)malloc(10);//堆
}

在board.c中对动态内存的配置函数

rt_system_heap_init(void * )HEAP_BEGIN,(void)HEAP_END);

在RTT中获取动态内存以及释放动态内存。

char *p;
p=(char*)rt_malloc(10);
rt_free(p);

内存复位
当我们申请到新的内存块之后,建议对所申请的内存块进行清零操作(rt_memset(p,0,10))。
内存泄漏
是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统奔溃等严重后果。

4.线程的创建

(1)线程的概念
在设计一个较为复杂的应用程序时,通常把一个大型任务分解成多个小任务,然后通过运行这些小任务,最终达到完成大任务的目的。
在RT-Thread中,与上述小任务对应的程序实体就叫做“线程”(或任务),RT-Thread就是一个能对这些小的“线程”进行管理和调度的多“线程“操作系统。
线程是实现任务的载体,他是RT-Thread中最基本的调度单位,它描述了一个任务执行的运行环境,也描述了这个任务所处的优先等级。
在RT-Thread中,线程由三部分组成;线程代码(入口函数)、线程控制块、线程堆栈组成。

线程代码

//无限循环结构
void thread_entry(void *parameter)
{
    while(1)
    {
      /*等待事件的发生*/
      /*处理事件*/
    }
}
//顺序循环结构
void thread_entry(void *parameter)
{
  /*事物1处理*/
    /*事物2处理*/
      /*事物3处理*/
}

线程控制块
线程数据块是操作系统用于管理线程的一个数据结构,它会存放线程的一些信息,例如优先级、线程名称、线程状态等,也包括线程与线程之间连接用的链表结构,线程等待事件集合等。

struct rt_thread
struct rt_thread  *rt_thread_t

线程栈
RT-Thread每个线程都具有独立的栈空间,当进行线程切换时,系统会将当前的线程的上下文保存在线程栈中,当线程要恢复运行时,再从线程栈中读取上下文信息,恢复线程的运行。
线程上下文是指线程执行时的环境,具体来说就是各个变量和数据包所有的寄存器变量、堆栈信息、内存信息等。
线程栈在形式上是一段连续的内存空间,我们可以通过定义一个数组或者申请一段动态内存来作为线程的栈。

创建线程
静态线程需要提前定义好线程空间,动态线程不需要提前定义分配。
在这里插入图片描述
静态线程参数:

  • struct_rt thread *thread --线程控制块的地址
  • const char *name —线程名称
  • void (*entry)(void *paeameter) --线程代码(入口函数)
  • void *parameter 参数,不传参可设置为0
  • void *stack_start 线程栈的起始地址
  • 线程栈的大小
  • 线程的优先级,表示线程内部的优先顺序,数字越小,执行顺序越高
  • 线程的时间片参数

动态线程参数:

  • 线程名称
  • 线程代码
  • 线程参数
  • 线程栈的大小
  • 线程的优先级
  • 线程的时间片

静态线程和动态线程的区别
1.是否需要提前定义
2.运行效率
如果系统使用外扩RAM,动态线程的线程控制块和线程栈的运行效率会有下降。系统内部RAM的运行效率差不多。
启动线程

rt_err_t rt_thread_startup(rt_thread_t thread)

调用此函数后创建的线程会被加入到线程的就绪队列,执行调度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜大大的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值