物联网嵌入式系统:RT_Thread系统临界资源和临界区(1)-禁止调度和禁止中断

 

物联网嵌入式系统: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);
    }
}

 

   

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值