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

请人做游戏的网站网络营销推广软件

请人做游戏的网站,网络营销推广软件,免费发布信息的网站,平台公司运作模式1 概念性内容 开机到调度需要经历的步骤有: 系统初始化任务创建启动调度器上下文切换时间分片任务执行 1.1 任务本质 FreeRTOS 的 任务(Task)本质上就是一个运行在任务自己的栈区中无限循环的函数 一段上下文(context&#x…

1 概念性内容

开机到调度需要经历的步骤有:

  • 系统初始化
  • 任务创建
  • 启动调度器
  • 上下文切换
  • 时间分片
  • 任务执行

1.1 任务本质

FreeRTOS 的 任务(Task)本质上就是一个运行在任务自己的栈区中无限循环的函数 + 一段上下文(context)数据
一个任务有四种状态:就绪态、挂起态、运行态、阻塞态

  • 就绪态:任务已准备好运行,处于就绪列表中,按优先级排序
  • 运行态:当前cpu正在执行该任务。
  • 阻塞态:因某些原因不能继续执行,被放入阻塞列表(延时会放入延时列表),阻塞消除会重新回到就绪列表。
  • 挂起态:手动调用api挂起,必须再调用resume才能恢复执行。
  • 终止态:不在调度器控制内。

1.2 什么是上下文

上下文其实就是线程的状态

线程状态包括:

类别保存内容
CPU寄存器R0~R12, LR, PC, xPSR
高级寄存器R4~R11(手动保存)
栈指针PSP(Process Stack Pointer)
状态寄存器xPSR
任务控制块保存任务的栈顶指针(SP)和其他调度信息

对寄存器不熟悉的同学可以参考:
ARM架构 中的寄存器内容

不同信息的保存实现:

类型内容描述
自动保存寄存器R0 ~ R3,
R12,
LR,
PC,
xPSR
由硬件在异常(中断)进入时自动压栈
手动保存寄存器R4~R11由 FreeRTOS 的上下文切换汇编代码手动压栈
特殊寄存器SP、
LR、
PSP/MSP
栈指针、返回地址,决定任务能否正确返回

FreeRTOS 会将这些上下文信息 保存在任务的栈中,并把 栈顶指针(即当前任务运行到哪)记录在任务的 TCB 中。

当再次切回这个任务时,就从它保存的栈中把这些寄存器恢复回来,任务就能从中断前的状态“无感恢复”。

2 代码

2.1 关键代码

(1)SVC_Handler
用途: SVC 异常通常用于实现系统调用,允许用户在特权级别(Supervisor)执行一些特殊的操作,例如请求操作系统服务。在启动调度时候会执行。
一般的,SVC_Handler主要用于启动第一个任务以及初始化系统的运行环境。在 FreeRTOS 启动过程中,prvStartFirstTask() 函数会被调用,该函数最终通过 SVC 请求来跳转至初始任务的执行路径。

__asm void vPortSVCHandler( void )
{PRESERVE8               // 保留R4-R11和LR寄存器,确保不会被改/* Get the location of the current TCB. */ldr    r3, =pxCurrentTCB   // pxCurrentTCB地址加载到寄存器r3。pxCurrentTCB:指向当前任务控制块的指针。ldr r1, [r3]            // pxCurrentTCB 的值加载到r1ldr r0, [r1]            // r1 指向的地址(TCB中的栈顶地址)加载到r0/* Pop the core registers. */ldmia r0!, {r4-r11, r14}// 加载多个寄存器,保存当前任务上下文msr psp, r0             // 更新程序堆栈指针(PSP)的值为r0,加载下一个任务的上下文isb             // 指令同步屏障,确保更新PSPmov r0, #0      // 将0移至寄存器r0,用于接下来重置基本优先级寄存器。msr    basepri, r0 // 中断优先级控制寄存器设置为零,允许所有中断。bx r14          // 使用r14(LR)的值返回到SVC调用之前的地址
}

(2)PendSVHandler

  • 为什么采用了pendSVHandler函数切换任务而不是在systick定时中断切换任务:
    如果优先级低,那么切换任务时会被别的高优先级任务打断,容易出问题。
    如果优先级高,那么高优先级任务执行切换任务的函数,耗时较长,实时性差。
  • 解决的办法:
    仅使用systick异常通知需要切换任务,
    使用优先级最低的PendSV_Handler中断函数来真正切换任务
__asm void xPortPendSVHandler( void )
{extern uxCriticalNesting;extern pxCurrentTCB;extern vTaskSwitchContext;/* *INDENT-OFF* */PRESERVE8mrs r0, pspisbldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ldr r2, [ r3 ]stmdb r0 !, { r4 - r11 } /* Save the remaining registers. */str r0, [ r2 ] /* Save the new top of stack into the first member of the TCB. */stmdb sp !, { r3, r14 }mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITYmsr basepri, r0dsbisbbl vTaskSwitchContextmov r0, #0msr basepri, r0ldmia sp !, { r3, r14 }ldr r1, [ r3 ]ldr r0, [ r1 ] /* The first item in pxCurrentTCB is the task top of stack. */ldmia r0 !, { r4 - r11 } /* Pop the registers and the critical nesting count. */msr psp, r0isbbx r14nop
/* *INDENT-ON* */
}

其中vTaskSwitchContext的函数实现如下

void vTaskSwitchContext( void )
{//如果调度器挂起那就不能进行任务切换if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ){xYieldPending = pdTRUE;}else{xYieldPending = pdFALSE;traceTASK_SWITCHED_OUT();taskCHECK_FOR_STACK_OVERFLOW();     /* Check for stack overflow, if configured. */taskSELECT_HIGHEST_PRIORITY_TASK(); /* 获取最高优先级的任务实现是一个宏,首先执行从任务列表中获取最高优先级任务,然后在最高优先级的任务就绪列表中获取下一个任务的控制块TCP。 */traceTASK_SWITCHED_IN();}
}
http://www.dtcms.com/wzjs/39064.html

相关文章:

  • 培训学校网站建设网站优化外包公司
  • 网站标题logo修改代码阿亮seo技术
  • 免费网站建设软件有哪些百度24小时人工电话
  • 网站备案资料修改泉州百度竞价推广
  • 网站别人给我做的备案 我能更改吗专业seo培训
  • 青园网站建设企业seo排名哪家好
  • 企业网站分析报告网站收录一键提交
  • asp网站模板安装seo外包 靠谱
  • 公司做网站还是做阿里好呢郑州seo网络营销
  • 免费网站模板mbxzbseo关键词首页排名代发
  • 卦神岭做网站市场营销四大基本策略
  • 织梦网站+当前位置限制宽度旺道seo
  • 做外贸的要有自己的网站吗整站seo教程
  • 可靠的手机网站建设优化搜索曝光次数的方法
  • 网站建设与维护是什么意思自己如何注册网站
  • 手机网页设计公司知名的搜索引擎优化
  • 电子商城网站设计公司哪个好无锡整站百度快照优化
  • 类似中企动力的做网站的清远今日头条新闻
  • 如何做一个公司网站济南seo整站优化厂家
  • ...温岭做网站网站制作和推广
  • 建设局和住建局区别武汉百度推广seo
  • 网站的用户登录一般怎么做的广州市口碑seo推广
  • 做网站能赚钱吗表情包拉新推广平台有哪些
  • 乌鲁木齐网站建设外链平台
  • wordpress域名更换插件简述seo的基本步骤
  • 朝阳网站建设是什么网站如何优化排名
  • 做公司网站需要注意什么网站换友链平台
  • 有没有做宠物的网站网络营销公司热线电话
  • 中国官方网站网站管理与维护
  • 做网站推广前途阿里巴巴国际站关键词推广