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

深圳做响应式网站公司利用虚拟主机建设企业网站

深圳做响应式网站公司,利用虚拟主机建设企业网站,外贸平台是做什么的,专题网站建设意义何在SylixOS 操作系统下#xff0c;任务切换可以分为两种 中断退出时#xff0c;执行的任务切换#xff08;_ScheduleInt#xff09;内核退出时#xff0c;执行的任务切换#xff08;_Schedule#xff09; 下面分别讲讲这两种任务切换 1、中断退出时任务切换 关于 ARM 架…SylixOS 操作系统下任务切换可以分为两种 中断退出时执行的任务切换_ScheduleInt内核退出时执行的任务切换_Schedule 下面分别讲讲这两种任务切换 1、中断退出时任务切换 关于 ARM 架构下栈空间推荐这篇文章ARM 栈和函数调用 ;/********************************************************************************************************* ; 中断入口 ;*********************************************************************************************************/FUNC_DEF(archIntEntry);/* 在 IRQ 模式下LRR14_irq存储的是 当前执行地址 4所以需要 减 4 调整回正确的返回地址 */SUB LR , LR, #4 ;/* 调整用于中断返回的 PC 值 */;/* 保存 REG 到 IRQ 模式栈空间中断上下文保存*/STMFD SP!, {LR} ;/* 保存返回地址 */STMFD SP!, {R0-R12} ;/* 保存寄存器 */;/* 将当前 IRQ 模式的栈指针 SP_irq 存入 R1用于后续保存 SYS 模式寄存器*/MOV R1 , SPMSR CPSR_c, #(DIS_INT | SYS32_MODE) ;/* 回到 SYS 模式 */;/* 将 SYS 模式的栈指针 SP_sys 存入 R1 指向的内存保存任务栈*/STMFD R1!, {SP} ;/* 保存 SP_sys */;/* 将 SYS 模式的链接寄存器 LR_sys 存入 R1 指向的内存保存任务返回地址 */STMFD R1 , {LR} ;/* 保存 LR_sys */MSR CPSR_c, #(DIS_INT | IRQ32_MODE) ;/* 回到 IRQ 模式 */SUB SP , SP , #(2 * 4) ;/* 调整 SP_irq */;/* 读取 SPSR_irq保存了被中断任务的 CPSR_sys */MRS R2 , SPSR;/* 将 SPSR_irq即原 CPSR_sys压入 IRQ 模式栈保存任务状态 */STMFD SP!, {R2} ;/* 保存 CPSR_sys */;/*; * API_InterEnter(SP_irq), 如果是第一次中断, 会将 IRQ 模式栈空间的 ARCH_REG_CTX; * 拷贝到当前任务 TCB 的 ARCH_REG_CTX 里; */MOV R0 , SPLDR R1 , API_InterEnterMOV LR , PCBX R1;/*; * 如果不是第一次进入中断, 那么上一次中断(工作在 SYS 模式)已经设置 SP_sys, 只需要回到 SYS 模式; */CMP R0 , #1BNE 1f;/*; * 第一次进入中断: 因为已经将 IRQ 模式栈空间的 ARCH_REG_CTX 拷贝到当前任务 TCB 的 ARCH_REG_CTX 里; * 调整 SP_irq; */ADD SP , SP , #(ARCH_REG_CTX_SIZE);/*; * 第一次进入中断: 获得当前 CPU 中断堆栈栈顶, 并回到 SYS 模式, 并设置 SP_sys; */LDR R0 , API_InterStackBaseGetMOV LR , PCBX R0MSR CPSR_c, #(DIS_INT | SYS32_MODE) ;/* 回到 SYS 模式 */MOV SP , R0 ;/* 设置 SP_sys */1:MSR CPSR_c, #(DIS_INT | SYS32_MODE) ;/* 回到 SYS 模式(不是多余的) */;/*; * bspIntHandle(); */LDR R1 , bspIntHandleMOV LR , PCBX R1;/*; * API_InterExit(); * 如果没有发生中断嵌套, 则 API_InterExit 会调用 archIntCtxLoad 函数, SP_irq 在上面已经调整好; */LDR R1 , API_InterExitMOV LR , PCBX R1这里有一个很重要的点API_InterStackBaseGet函数。因为 ARM 异常栈通常不会很大而我们后面调用的 bspIntHandle 是一个 C 函数需要用到堆栈。所以这里调用 API_InterStackBaseGet 函数设置了一个操作系统给每个 CPU 分配的中断堆栈。 LW_API ULONG API_InterEnter (ARCH_REG_T reg0,ARCH_REG_T reg1,ARCH_REG_T reg2,ARCH_REG_T reg3) {PLW_CLASS_CPU pcpu;pcpu LW_CPU_GET_CUR();pcpu-CPU_ulInterNesting;#if !defined(__SYLIXOS_ARM_ARCH_M__) || (LW_CFG_CORTEX_M_SVC_SWITCH 0)archIntCtxSaveReg(pcpu, reg0, reg1, reg2, reg3); #endif ...... }这里要注意中断上下文的保存不仅仅需要保存到 ARM 架构的异常栈中同时也需要保存一份到当前任务 TCB 中。因为中断退出时API_InterExit会进行调度_ScheduleInt。所以无法保证中断结束后一定运行的是之前被中断的任务也有可能是其它高优先级任务。之前被中断的任务的上下文现场必须要保存一份到它自己的 TCB 中用于后面恢复 API_InterExit 函数中的 __KERNEL_SCHED_INT 会进行一系列判断查找到需要切换的任务不一定是之前被打断的任务获得任务的 TCB 控制块。然后使用 archIntCtxLoad 函数进行任务上下文切换。 LW_API VOID API_InterExit (VOID) {......__KERNEL_SCHED_INT(pcpu); /* 中断中的调度 */...... #if !defined(__SYLIXOS_ARM_ARCH_M__) || (LW_CFG_CORTEX_M_SVC_SWITCH 0)archIntCtxLoad(pcpu); /* 中断返回 (当前任务 CTX 加载)*/ #endif...... }FUNC_DEF(archTaskCtxStart)LDR R0 , [R0] ;/* 获取当前 TCB 的 REG_CTX 地址*/LINE_LABEL(archTaskCtxLoad)LDMIA R0!, {R2-R4} ;/* 读取 CPSR LR SP */MSR CPSR_c , #(DIS_INT | SYS32_MODE) ;/* 进入 SYS 模式, 关中断 */MOV SP , R4 ;/* 恢复 SP_sys */MOV LR , R3 ;/* 恢复 LR_sys */MSR CPSR_c, #(DIS_INT | SVC32_MODE) ;/* 进入 SVC 模式, 关中断 */MSR SPSR_cxsf , R2 ;/* CPSR_sys - SPSR_svc */LDMIA R0 , {R0-R12, PC}^ ;/* 恢复包括 PC 的所有寄存器, */;/* 同时更新 CPSR */FUNC_END()FUNC_DEF(archIntCtxLoad)B archTaskCtxStartFUNC_END()2、内核退出时任务切换 在内核退出时最终会调用 archTaskCtxSwitch 函数进行任务切换。 INT _Schedule (VOID) {....../* 前面的调度已经找到了一个最适合在当前核上运行的任务下面就是将该任务加载到当前 CPU 核的寄存器中 */archTaskCtxSwitch(pcpuCur); ...... } /********************************************************************************************************* ** 函数名称: __kernelExit ** 功能描述: 退出内核状态 ** 输 入 : NONE ** 输 出 : 调度器返回值 ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT __kernelExit (VOID) {......iRetVal _Schedule(); /* 尝试调度 */...... }首先是保存当前上下文和进入中断时一样保存当前 TCB 上下文。这里有一个很重要的点_SchedSafeStack函数。因为是任务调度所以使用的栈还是当前 TCB 的栈。因为我们下面需要调用 _SchedSwp C 函数会用到栈可能会破坏之前 TCB 的栈空间。所以我们需要调用 _SchedSafeStack函数来获取一个额外的堆栈空间。 然后调用 _SchedSwp 程序进行切换当前 CPU 控制块的当前 TCB然后进行上下文恢复。 ;/********************************************************************************************************* ; 线程切换 ; 参数为当前 CPU 控制块, 即 R0 为当前 CPU 控制块指针 ;*********************************************************************************************************/FUNC_DEF(archTaskCtxSwitch)LDR R1 , [R0] ;/* 获取当前 TCB */ADD R1 , R1 , #(ARCH_REG_CTX_SIZE) ;/* 当前 TCB 的 REG_CTX 顶端地址*//* 保存当前 TCB 的上下文保存到当前 TCB 中 */STMFD R1!, {LR} ;/* 保存返回地址 */STMFD R1 , {R0-R12} ;/* 保存寄存器 */SUB R1 , R1 , #(13 * 4) ;/* 调整 R1 */STMFD R1!, {SP} ;/* 保存 SP */STMFD R1!, {LR} ;/* 保存 LR */MRS R2 , CPSR ;/* 保存 CPSR */STMFD R1!, {R2}MOV R9 , R0 ;/* 备份 R0 */ #if LW_CFG_SMP_EN 0LDR R1 , _SchedSafeStack ;/* _SchedSafeStack(); */MOV LR , PCBX R1MOV SP , R0 ;/* 设置 SP */MOV R0 , R9 ;/* 恢复 R0 */ #endif;/* 这里会去切换当前 CPU 控制块的当前 TCB */LDR R1 , _SchedSwp ;/* _SchedSwp(); */MOV LR , PCBX R1MOV R0 , R9 ;/* 恢复 R0 */;/* 因为刚刚已经切换过这里直接恢复切换后的 TCB 上下文 */B archTaskCtxStartFUNC_END()archTaskCtxStart 这里和中断退出时恢复寄存器一样。
http://www.hkea.cn/news/14341756/

相关文章:

  • 免费招聘网站哪个好我们网站百度快照显示违规内容
  • 创建一个免费网站论坛定制
  • 养老院网站建设的好处wordpress淘点金插件
  • 百度商桥要怎么添加到网站ppt欢迎页面模板
  • 网站开发常用框架长沙做电商网站设计
  • 网站建设的十点优势做一些网站犯法么
  • 网站建设公司常州js网站下拉置顶代码
  • android app开发 wordpress智能seo系统
  • 一个网站主机多少钱微信做一元云购网站
  • 南通模板自助建站电子购物网站开发
  • 做网站的边框素材网易企业邮箱登录登录入口网页版
  • 襄阳商城网站建设做网站的方案
  • 网站图片像素木马工业设计公司
  • 酒店网站建设 源码中国百强企业
  • 100个科技小制作太原seo哪家好
  • 网站建设价格槽闸阀室内设计效果图一套
  • 中国空间站建造历程中卫网站设计在哪里
  • 山东省双体系建设网站合肥瑶海区天气
  • 厦门网站建设哪家不错推荐资讯网站开发需求
  • vs2010 iis 网站开发小程序开发 上海
  • 专门做网站的公司叫什么大数据网站
  • 哪个网站做图书广告好彩票网站代理怎么做
  • 网站设计主色学校wordpress添加微信
  • 建设网站方面的证书动漫制作专业介绍心得体会200字
  • 温州网站优化指导天津快速关键词排名
  • 益阳北京网站建设怎么建设公司小程序网站
  • 怎样保证网站的安全沈阳专业的网站设计公司
  • 青岛seo网站排名优化厦门软件园网站开发
  • 建网站赚钱方法外贸推广代理
  • 宁波北京网站建设wordpress 表单展示