物联网嵌入式系统:RT_Thread系统临界资源和临界区(2)-信号量
物联网嵌入式系统:RT_Thread系统临界资源和临界区(3)-互斥量
临界资源
指一次仅仅允许一个线程访问的共享资源,它可以是一个具体的硬件设备,也可以是一个变量,可以是缓冲区等,这些都称为临界资源,或者共享资源,多个任务同时运行,只能允许一个任务访问的资源。
临界区
每个进程中访问临界资源的那段代码称为临界区,
每次只允许一个进程进入临界区,进入后,不允许其他进程进入。不论是硬件临界资源还是软件临界资源,多个进程必须互斥的对它进行访问。多个进程涉及到同一个临界资源的的临界区称为相关临界区。使用临界区时,一般不允许其运行时间过长,只要运行在临界区的线程还没有离开,其他所有进入此临界区的线程都会被挂起而进入等待状态。
RT-Thread对临界区的保护方式
禁止调度:关闭系统调度保护临界区:
就是将RT-Thread中的调度器上锁,不允许系统进行线程切换,这样就可以保护当前的线程不被切换,及就是保护保证当前使 用的临界资源或者当前的临界区不被其它线程访问。直到调度器解锁为止,或者中断响应为止。
相关API;
rt_enter_critical()/*调度器上锁*/
rt_exit_critical()/*调度器解锁*/
禁止中断
所有的线程调度都是建立在中断的基础上,所以当我们关闭了中断后,系统就不会再进行调度,线程自身也不会被其它线程抢占了。
相关的API:
rt_hw_interrupt_disable();/*关闭中断*/
rt_hw_interrupt_enable(); /*重新使能中断*/
示例:
void thread_entry(void *parameter)
{
rt_uint32_t no;
rt_uint32_t level;
no = (rt_uint32_t) parameter;
while (1)
{
/* 关闭中断 */
level = rt_hw_interrupt_disable();
cnt += no;
/* 恢复中断 */
rt_hw_interrupt_enable(level);
rt_kprintf("protect thread[%d]'s counter is %d\n", no, cnt);
rt_thread_mdelay(no * 10);
}
}