当前位置: 首页 > news >正文

郑州网站推广服务深圳竞价托管

郑州网站推广服务,深圳竞价托管,哈尔滨权威做网站,微信小程序开发平台游戏一 函数taskENTER_CRITICAL,taskEXIT_CRITICAL 函数taskENTER_CRITICAL最终实现如下: 第①处按照系统设定的configMAX_SYSCALL_INTERRUPT_PRIORITY值对中断进行屏蔽 第②处调用一次自增一次 第③处检查中断状态寄存器位,如果有任何中断位置…

一 函数taskENTER_CRITICAL,taskEXIT_CRITICAL

函数taskENTER_CRITICAL最终实现如下:

第①处按照系统设定的configMAX_SYSCALL_INTERRUPT_PRIORITY值对中断进行屏蔽

第②处调用一次自增一次

第③处检查中断状态寄存器位,如果有任何中断位置1,说明是在中断中,那么报错,因为此函数不允许中断中使用。

taskEXIT_CRITICAL函数最终实现如下:

第①处如果前面有过一次以上调用taskENTER_CRITICAL,那么仍然禁止中断configMAX_SYSCALL_INTERRUPT_PRIORITY值以上的中断都不能开启,直到最后一次退出才真正退出,这个意思就是从第一次调用taskENTER_CRITICAL的范围内的代码都不能被中断打扰。

第② 处直接将basepri寄存器写0开启所有中断,taskEXIT_CRITICAL函数没有参数带入,只要调用它就是开启所有中断。

二 taskENTER_CRITICAL_FROM_ISR,taskEXIT_CRITICAL_FROM_ISR

1)taskENTER_CRITICAL_FROM_ISR函数最终实现:

第①②处,将BASEPRI赋值之前先将其值取出来,之后返回

第③处,向BASEPRI寄存器赋新值,

注:BASEPRI是arm的一个寄存器,可以设置一个数值,向寄存器BASEPRI写入某数值时大于等于此数值的中断都会被屏蔽。

2) taskEXIT_CRITICAL_FROM_ISR(xReturn)实现

此函数是带参数的,并不是像taskEXIT_CRITICAL一样直接将0赋值给BASEPRI,而这个参数就是

taskENTER_CRITICAL_FROM_ISR的返回值。

3)这样做有什么作用呢?

直接用实例解释比较容易理解:

// 嵌套中断示例
void Nested_ISR(void) {
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    BaseType_t xSavedInterruptStatus1, xSavedInterruptStatus2;
    
    // 第一层临界区保护
    xSavedInterruptStatus1 = taskENTER_CRITICAL_FROM_ISR();
    
    /* 执行第一层临界区代码 */
    

   // 第二层临界区保护(嵌套)
    xSavedInterruptStatus2 = taskENTER_CRITICAL_FROM_ISR();
    
    /* 执行第二层临界区代码 */
    
    // 按相反顺序退出临界区
    taskEXIT_CRITICAL_FROM_ISR(xSavedInterruptStatus2);
   

   taskEXIT_CRITICAL_FROM_ISR(xSavedInterruptStatus1);
    
    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

假设系统设置configMAX_SYSCALL_INTERRUPT_PRIORITY为11

第一次调用前basepri寄存器应该为0,所以xSavedInterruptStatus1=0,调用之后basepri寄存器为11,(如果当前中断优先级为11以上,那么11~15的中断都不能响应,如果当前中断优先级位11以下比如9,那么9以上都不能响应)。

第二次调用前basepri寄存器应该为11,所以xSavedInterruptStatus2=11,调用之后basepri寄存器为11,(如果当前中断优先级为11以上,那么11~15的中断都不能响应,如果当前中断优先级位11以下比如9,那么9以上都不能响应)。

第一次返回时因为xSavedInterruptStatus2=11,basepri寄存器应该为11,0~11都能执行,12~15都不能执行,此时如果使用不带ISR的临界屏蔽taskEXIT_CRITICAL()返回   ,那么0~15都能执行,违背初衷。

第二次返回时因为xSavedInterruptStatus2=0,basepri寄存器应该为0,优先级0~15都能执行。

题外话:

也许中断使用带ISR的屏蔽也许还有一个作用,就是跟任务分开,

因为任务中使用临界段仅仅可能只是想能够屏蔽其他任务的干扰,因为其他任务切换依靠最低优先级pendSV切换, 设定一个屏蔽值,可能不想屏蔽高优先级的中断。

而中断使用临界段的意图是屏蔽更高优先级的中断,起码要比当前中断的优先级要高一级(自然比任务的优先级也要高),如果同样使用 taskEXIT_CRITICAL(),一是起不到作用起不到想要的效果(屏蔽更高优先级的中断),二是起不到嵌套分层的作用,所以两者不能使用相同的屏蔽方式?

总之freeRTOS的任务跟中断是分离的两套系统,一个是任务级临界段代码保护,通过嵌套计数实现,一个是中断级代码临界段保护,通过保存和恢复寄存器BASEPRI的数值实现嵌套使用,最好是互不干扰。

以下来自deepseek的回答有点乱感觉不对稍微参考:

FreeRTOS中断中不能使用taskENTER_CRITICAL()的主要原因如下:

  1. 嵌套机制冲突
    taskENTER_CRITICAL()通过递归计数管理临界区嵌套,但中断服务程序(ISR)可能被更高优先级中断打断,导致嵌套计数不一致,从而引发中断状态恢复错误。

  2. 中断上下文特殊性
    中断中直接关闭所有中断(如taskENTER_CRITICAL()的操作)会破坏实时性,可能导致高优先级中断无法及时响应。FreeRTOS为此专门提供taskENTER_CRITICAL_FROM_ISR(),仅屏蔽特定优先级的中断而非全部。

  3. 优先级管理差异
    taskENTER_CRITICAL()通过操作BASEPRI寄存器屏蔽低于某优先级的中断,而中断服务程序本身可能已处于高优先级上下文,直接调用会导致不可预测的行为。

  4. 任务调度限制
    中断中若使用任务级临界区保护,可能因调度器状态不一致引发任务切换异常,甚至

    死锁。

http://www.cadmedia.cn/news/3813.html

相关文章:

  • 罗庄建设局网站澳门seo推广
  • 天津seo方案家庭优化大师免费下载
  • 海淘直邮购物网站网络推广营销
  • 临海高端营销型网站建设地址比较好的免费网站
  • 泉州网站建设公司首选公司哪家好网站推广是干嘛的
  • ie9网站后台编辑器百度经验首页登录官网
  • 娄底建设网站的公司网站批量查询工具
  • 物流网站建设规划书上海网站营销seo电话
  • 互联网设计是做什么的怎么做网站优化
  • 拓者设计吧效果图站内seo是什么意思
  • 苏州自助建站平台怎么在网上做网络营销
  • 网站模板带后台百度有刷排名软件
  • 北京到广州列车时刻表seo的主要工作是什么
  • 莱芜高端网站建设报价微信小程序开发教程
  • 网站建设要程序员吗关键词排名优化
  • 织梦网站建设教程市场营销案例
  • 程序员和做网站那个好找工作公司网站建设
  • 部门网站建设工作总结百度竞价排名广告定价
  • 百度采购网官方网站出词
  • 呼市建设委员会网站每天三分钟新闻天下事
  • 网站公安备案怎么操作廊坊seo优化
  • 北京做网站建设多少钱郑州谷歌优化外包
  • 临沂集团网站建设seo第三方点击软件
  • 中软属于国企还是央企seo研究中心
  • 金坛建设银行总行网站做市场推广应该掌握什么技巧
  • 哪个兄弟来个直接看的网站谷歌play
  • 武汉网站建设 乐云seo购买网站域名
  • 网站运营内容方案网站优化网络推广seo
  • 山西做网站哪个好凡科建站官网
  • 东莞教育团购网站建设微信公众号推广网站