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

企业做网站好吗windows2012系统怎么建设网站

企业做网站好吗,windows2012系统怎么建设网站,天津网站建设 文率科技,网络舆情处置方案0 前言 什么是临界区#xff08;临界段#xff09;#xff1f; 裸机编程中由于不涉及线程和线程切换#xff0c;因此没有临界区这一个概念。在RTOS中由于存在线程切换等场景#xff0c;便有了临界区这个概念。简单来说#xff0c;临界区就是不允许被中断的代码区域。什么…0 前言 什么是临界区临界段 裸机编程中由于不涉及线程和线程切换因此没有临界区这一个概念。在RTOS中由于存在线程切换等场景便有了临界区这个概念。简单来说临界区就是不允许被中断的代码区域。什么时候代码执行的过程会被打断一个是线程切换一个是异常事件。对于RT-Thread而言实际上都是异常事件导致代码执行过程被中断因为RT-Thread是在PendSV事件内进行线程切换的。 什么样的代码区域应该作为临界区保护起来 假如我们有2个线程A和B它们都有可能使用同一个串口向外打印数据而我们希望线程A和B在执行printf这个操作时是不会被打断的否则我们看到的串口打印数据将杂乱无章。下面是一个例子 void thread_a(void *arg) {for (;;){printf(A thread!\r\n);} }void thread_b(void *arg) {for (;;){printf(B thread!\r\n);} }假设线程A和线程B是按照时间片轮转进行调度的那么就有可能出现线程A正在打印A thread!\r\n时被线程B获得CPU使用权进而打印线程B的B thread!\r\n最后呈现在串口上的数据杂乱无章。这不是我们希望看到的结果因此我们需要将printf作为临界区保护起来以RT-Thread临界区保护API为例修改后的代码如下 void thread_a(void *arg) {for (;;){rt_enter_critical(); // 进入临界区printf(A thread!\r\n);rt_exit_critical(); // 退出临界区} }void thread_b(void *arg) {for (;;){rt_enter_critical(); // 进入临界区printf(B thread!\r\n);rt_exit_critical(); // 退出临界区} }1 RTOS中临界区保护的实现原理基于RT-Thread 前面我们已经知道导致代码段被中断的原因就是发生了异常事件为了实现对临界区的保护可以选择最简单直接的方法关闭全部中断NMI fault和硬fault除外为了避免直接关闭中断带来的不良影响RT-Thread为我们提供了2种方案 1开关全部中断 2使能/失能线程调度 1.1 开关全部中断 ARM的M3/M4/M7内核为了快速开关中断专门设置了一条CPS指令共有以下4种用法 CPSID I ;PRIMASK1 ;关中断 CPSIE I ;PRIMASK0 ;开中断 CPSID F ;FAULTMASK1, ;关异常 CPSIE F ;FAULTMASK0 ;开异常有关上述寄存器的定义如下 这里我们并不想关闭硬件fault因此只会使用CPSID I和CPSIE I这2条指令。对于没有出现临界区嵌套的情况直接在进入临界区前关中断退出临界区后关中断即可实现对临界区的保护。但如果临界区出现嵌套的话只是单纯使用开关中断显然无法满足我们要求看看RT-Thread如何解决这个问题的 // 关全部中断 rt_base_t rt_hw_interrupt_disable(void); ;/* ; * rt_base_t rt_hw_interrupt_disable(); ; */ rt_hw_interrupt_disable PROCEXPORT rt_hw_interrupt_disableMRS r0, PRIMASKCPSID IBX LRENDP // 开全部中断 void rt_hw_interrupt_enable(rt_base_t level); ;/* ; * void rt_hw_interrupt_enable(rt_base_t level); ; */ rt_hw_interrupt_enable PROCEXPORT rt_hw_interrupt_enableMSR PRIMASK, r0BX LRENDP可以看到我们使能中断时是需要传入一个rt_base_t类型参数这个就是RT-Thread实现临界区嵌套保护的关键。我们使用时只需要按照如下格式进行嵌套保护即可下面是一个一重临界区嵌套保护的示例 rt_base_t level1; rt_base_t level2; void thread_a(void *arg) {for (;;){level1 rt_hw_interrupt_disable(); printf(A thread!\r\n);level2 rt_hw_interrupt_disable();printf(A thread!!\r\n);rt_hw_interrupt_enable(level2); printf(A thread!!!\r\n);rt_hw_interrupt_enable(level1);} }结合前面的汇编代码我们很容易可以发现只有在执行最后一个rt_hw_interrupt_enable操作时才会打开全部中断真正实现嵌套临界区的保护。 它的实现原理就是使用全局变量保存进入临界区之前的全部中断开关状态然后退出临界区时根据这个开关状态来进行全部中断开关。根据临界区嵌套保护语句的顺序显然只有执行了最后一个rt_hw_interrupt_enable才会打开全部中断。 1.2 使能/失能线程调度 相比前面直接开关中断来实现临界区保护使能/失能线程调度则显得“温柔”很多它并不会长时间关闭中断对我们的一些中断事件例如SysTick时间基准造成影响如果我们的线程并不会被中断服务函数内的操作影响推荐使用使能/失能线程调度的方法去实现临界段保护RT-Thread提供的相关函数如下 // 失能线程调度 /*** This function will lock the thread scheduler.*/ void rt_enter_critical(void) {register rt_base_t level;/* disable interrupt */level rt_hw_interrupt_disable();/** the maximal number of nest is RT_UINT16_MAX, which is big* enough and does not check here*/rt_scheduler_lock_nest ;/* enable interrupt */rt_hw_interrupt_enable(level); } ;/* ; * rt_base_t rt_hw_interrupt_disable(); ; */ rt_hw_interrupt_disable PROCEXPORT rt_hw_interrupt_disableMRS r0, PRIMASKCPSID IBX LRENDP// 使能线程调度 /*** This function will unlock the thread scheduler.*/ void rt_exit_critical(void) {register rt_base_t level;/* disable interrupt */level rt_hw_interrupt_disable();rt_scheduler_lock_nest --;if (rt_scheduler_lock_nest 0){rt_scheduler_lock_nest 0;/* enable interrupt */rt_hw_interrupt_enable(level);if (rt_current_thread){/* if scheduler is started, do a schedule */rt_schedule();}}else{/* enable interrupt */rt_hw_interrupt_enable(level);} } ;/* ; * void rt_hw_interrupt_enable(rt_base_t level); ; */ rt_hw_interrupt_enable PROCEXPORT rt_hw_interrupt_enableMSR PRIMASK, r0BX LRENDP1rt_enter_critical函数 首先关闭全部中断将rt_scheduler_lock_nest自增1然后将中断状态还原到rt_enter_critical函数最开始的状态。 2rt_exit_critical函数 首先关闭全部中断将rt_scheduler_lock_nest自减1如果rt_scheduler_lock_nest0表示临界区保护结束需要退出临界区这时rt_scheduler_lock_nest0然后将中断状态还原到函数最开始的状态如果调度已经开始则发起一次调度尽可能保证更高优先级线程能够得到及时运行。如果rt_scheduler_lock_nest0表示临界区保护还未结束将中断状态还原到函数最开始的状态。 实现临界区嵌套保护的核心就是rt_scheduler_lock_nest借助嵌套临界区保护操作成对出现这一特点使用rt_scheduler_lock_nest调度锁表征当前临界区保护嵌套执行情况当rt_scheduler_lock_nest0时则可以退出临界区保护因此rt_exit_critical()和rt_exit_critical()无需人为定义全局变量就可以实现临界区嵌套保护使用起来更加方便。
http://www.pierceye.com/news/819830/

相关文章:

  • 防城港门面做网站的代做网站跳转
  • 珠海网站系统建设苏州房地产网站建设
  • 长治网站建设培训文件检察院网站建设
  • 茶文化网站制作asa8.4 做网站映射
  • 网站建设步骤 文档富阳做网站洛洛科技
  • 列举网站建设的SEO策略广东建设行业招聘 什么网站
  • 免费社区建站系统seo是指什么
  • 网站建设实训的认识小企业网站建设哪里做得好
  • 无锡seo网站排名优化牟平建设企业网站
  • 网络营销好找工作吗成都seo优化公司排名
  • 网站换关键词山西网站备案
  • 网站微信建设运维经验深圳罗湖企业网站
  • 国外设计类网站泰安网网站建设
  • 做暖暖小视频网站手机 dns 国外网站
  • 子网站建设工作网站 首页布局 seo
  • 网站域名是什么传奇辅助网站怎么做
  • 在那个上面做网站都能搜到新乡网站建设设计
  • 网站编辑 seo是什么 百度知道本地网站搭建流程
  • 用凡科做网站好吗搜索自媒体平台
  • 学设计的网站有哪些内容免费设计图片软件
  • 柳州建站公司404错误直接转向到网站首页
  • 字画网站建设iis怎么查看网站的域名
  • 公司门户网站建设特点新增专业建设规划
  • 备案号怎么放置到网站长春如何建立一个平台网站
  • 企业网站的一般要素包括厂房设计
  • 郑州做网站 汉狮网络深圳市中心是哪个区
  • jsp做的婚恋网站做死活题网站
  • 帮做网站的公司荥阳网站优化公司
  • 网页设计心得体会正文合肥网站推广优化公司
  • 邯郸菜鸟网站建设网站搭建费用价格表