rtthread的使用分析

技术rtthread的使用分析这篇文章将为大家详细讲解有关rtthread的使用分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。RT-Thread 中,实际上线程并不存

本文将详细解释rtthread的用法分析。文章内容质量较高,边肖将分享给大家参考。希望你看完这篇文章后有所了解。

在RT-Thread中,实际上没有线程的运行状态,就绪状态和运行状态是一样的。

当一个线程完成运行后,系统会自动删除该线程:自动执行rt_thread_exit()函数,先将该线程从系统就绪队列中删除,然后将该线程的状态改为关闭状态,不再参与系统调度,再将其挂入rt _ thread _ unct僵尸队列(未回收且处于关闭状态的线程的队列),最后由空闲线程回收被删除线程的资源。

动态是创建/删除,静态是初始化/分离。

需要注意的是,用户提供的栈头地址需要系统对齐(例如ARM上要求4字节对齐)。线程初始化接口rt_thread_init()的参数和返回值见下表:

00-1010当前线程的时间片用完或线程主动请求放弃处理器资源时,将不再占用处理器,调度器将选择下一个优先级相同的线程执行。在线程调用这个接口之后,这个线程仍然在就绪队列中。线程放弃处理器使用以下功能接口:

rt _ err _ TRT _ thread _ yield(void);

通常,这个函数不应该用来挂起线程本身。如果真的需要rt_thread_suspend()函数来挂起当前任务,那么在调用rt_thread_suspend()函数手动切换线程上下文之后,应该立即调用rt_schedule()函数。用户只需要知道这个界面的功能,不建议使用这个界面。

空闲线程是线程状态始终为就绪的线程,因此钩子函数集必须保证空闲线程在任何时候都不会挂起,比如rt_thread_delay()、rt_sem_take()等可能导致线程挂起的函数都不能使用。

关于删除线程:大部分线程循环执行,无需删除;另一方面,可以完成运行的线程,RT-Thread会在线程运行后自动删除该线程,并在rt_thread_exit()中完成删除。用户只需要知道这个接口的功能,不建议使用(其他线程可以调用这个接口或者在timer timeout函数中调用这个接口来删除一个线程,但是这种使用非常少见)。

RT-Thread定时器的默认模式是HARD_TIMER模式,即定时器超时后,超时功能在系统时钟中断的上下文中运行。

线程同步的方式有很多,核心思想是:在访问临界区的时候只允许一个(或一类)线程运行。进入/退出临界区的方式有很多:

1)调用rt_hw_interrupt_disable()进入临界区,调用rt_hw_interrupt_enable()退出临界区;详见《中断管理》全局中断开关。

2)调用rt_enter_critical()进入临界区,调用rt_exit_critical()退出临界区。

信号量可以实现线程间的同步或互斥,但会造成优先级反转。建议使用互斥锁实现,不需要优先级反转。

使线程让出处理器资源

信号量是一种非常灵活的同步方法,可以在很多场合使用。锁、同步、资源计数等的关系。也可以方便地用于线程、中断和线程之间的同步。

中断和线程之间的互斥不能通过信号量(锁)来实现,而是通过切换中断来实现。

在RT-Thread操作系统中,互斥可以解决优先级反转问题,实现了优先级继承算法。优先级继承是通过在线程A试图获取共享资源时挂起期间,将线程C的优先级提升到线程A的优先级,来解决优先级反转带来的问题。

事件集主要用于线程之间的同步。与信号量不同,它可以实现一对多和多对多同步。

00-1010事件集可以用在很多场合,对于线程间的同步,它可以在一定程度上替代信号量。线程或中断服务例程向事件集对象发送一个事件,然后等待的线程唤醒并处理相应的事件。然而,与信号量不同,事件的发送操作直到事件被清除后才累积,而信号量的释放操作是累积的。事件的另一个特点是接收线程可以等待多个事件,即多个事件对应一个线程或多个线程。同时,根据线程等待的参数,可以选择是逻辑OR触发器还是逻辑AND触发器。此功能在信号量等中不可用。信号量只能识别一个释放动作,但不能

能同时等待多种类型的释放。

邮箱 4*size ,每次只能传输4字节数据

消息队列 n*size 每次传输n字节数据。

邮箱是一种简单的线程间消息传递方式,特点是开销比较低,效率较高。在 RT-Thread 操作系统的实现中能够一次传递一个 4 字节大小的邮件,并且邮箱具备一定的存储功能,能够缓存一定数量的邮件数 (邮件数由创建、初始化邮箱时指定的容量决定)。邮箱中一封邮件的最大长度是 4 字节,所以邮箱能够用于不超过 4 字节的消息传递。由于在 32 系统上 4 字节的内容恰好可以放置一个指针,因此当需要在线程间传递比较大的消息时,可以把指向一个缓冲区的指针作为邮件发送到邮箱中,即邮箱也可以传递指针

消息队列的使用场合

消息队列可以应用于发送不定长消息的场合,包括线程与线程间的消息交换,以及中断服务例程中给线程发送消息(中断服务例程不能接收消息)。下面分发送消息和同步消息两部分来介绍消息队列的使用。

信号的工作机制

信号在 RT-Thread 中用作异步通信,POSIX 标准定义了 sigset_t 类型来定义一个信号集,然而 sigset_t 类型在不同的系统可能有不同的定义方式,在 RT-Thread 中,将 sigset_t 定义成了 unsigned long 型,并命名为 rt_sigset_t,应用程序能够使用的信号为 SIGUSR1(10)和 SIGUSR2(12)。

信号本质是软中断,用来通知线程发生了异步事件,用做线程之间的异常通知、应急处理。一个线程不必通过任何操作来等待信号的到达,事实上,线程也不知道信号到底什么时候到达,线程之间可以互相通过调用 rt_thread_kill() 发送软中断信号。

通过上述的计算过程,我们可以看出其中的一些关键因素:发送数据量越小,发送速度越快,对于数据吞吐量的影响也将越大。归根结底,取决于系统中产生中断的频度如何。当一个实时系统想要提升数据吞吐量时,可以考虑的几种方式:

1)增加每次数据量发送的长度,每次尽量让外设尽量多地发送数据;

2)必要情况下更改中断模式为轮询模式。同时为了解决轮询方式一直抢占处理机,其他低优先级线程得不到运行的情况,可以把轮询线程的优先级适当降低。

由于关闭全局中断会导致整个系统不能响应中断,所以在使用关闭全局中断做为互斥访问临界区的手段时,必须需要保证关闭全局中断的时间非常短,例如运行数条机器指令的时间。

关于rtthread的使用分析就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/81165.html

(0)

相关推荐

  • Kerberos命令怎么使用

    技术Kerberos命令怎么使用Kerberos命令怎么使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.登录 kinit admin/admin@

    攻略 2021年11月11日
  • 忽视数据中心物理基础设施的现代化将产生的问题有哪些

    技术忽视数据中心物理基础设施的现代化将产生的问题有哪些这篇文章主要讲解了“忽视数据中心物理基础设施的现代化将产生的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“

    攻略 2021年10月22日
  • vxworks怎么看任务使用情况(vxworks操作系统用在哪儿)

    技术vxworks中系统任务有哪些小编给大家分享一下vxworks中系统任务有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!根据配置的不同,VxWorks系统在启动时,会同步启动一些系统任务,其中有

    攻略 2021年12月22日
  • 怎么优化SQL代码

    技术怎么优化SQL代码这篇文章主要介绍“怎么优化SQL代码”,在日常操作中,相信很多人在怎么优化SQL代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么优化SQL代码”的疑惑有所帮助!

    攻略 2021年11月12日
  • mysql怎么看哪个是字段类型(mysql一个类型分成几个字段)

    技术MySQL字段类型分为哪几类这篇文章主要介绍“MySQL字段类型分为哪几类”,在日常操作中,相信很多人在MySQL字段类型分为哪几类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyS

    攻略 2021年12月25日
  • mysql百万级数据统计(mysql百万级数据分组)

    技术Mysql百万级数据迁移的示例分析这篇文章将为大家详细讲解有关Mysql百万级数据迁移的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    攻略 2021年12月20日