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

网站建设 免费汕头网站建设制作厂家

网站建设 免费,汕头网站建设制作厂家,那些网站容易做淘宝推广,摄影网页设计说明ucosii 任务调度和原理1、ucos-ii 任务创建与任务调度 1.1、任务的创建 当你调用 OSTaskCreate( ) 进行任务的创建的时候#xff0c;会初始化任务的堆栈、保存cpu的寄存器、创建任务的控制块#xff08;OS_TCB#xff09;等的操作#xff1b; if (OSTCBPrioTbl[prio] (OS_… ucosii 任务调度和原理1、ucos-ii 任务创建与任务调度 1.1、任务的创建 当你调用 OSTaskCreate( ) 进行任务的创建的时候会初始化任务的堆栈、保存cpu的寄存器、创建任务的控制块OS_TCB等的操作 if (OSTCBPrioTbl[prio] (OS_TCB *)0) { /* Make sure task doesnt already exist at this priority */OSTCBPrioTbl[prio] OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ... *//* ... the same thing until task is created. */OS_EXIT_CRITICAL();psp OSTaskStkInit(task, p_arg, ptos, 0u); /* Initialize the tasks stack */err OS_TCBInit(prio, psp, (OS_STK *)0, 0u, 0u, (void *)0, 0u);if (err OS_ERR_NONE) {if (OSRunning OS_TRUE) { /* Find highest priority task if multitasking has started */OS_Sched();}} else {OS_ENTER_CRITICAL();OSTCBPrioTbl[prio] (OS_TCB *)0;/* Make this priority available to others */OS_EXIT_CRITICAL();}return (err);} 注意ucosii不支持两个及以上相同的任务优先级的任务ucosiii支持时间片轮转。ucosii 的任务控制块是任务中很重要它记录了任务的信息包括优先级、延时时间、状态等信息。控制块定义如下 typedef struct os_tcb {OS_STK *OSTCBStkPtr; /* Pointer to current top of stack */#if OS_TASK_CREATE_EXT_EN 0uvoid *OSTCBExtPtr; /* Pointer to user definable data for TCB extension */OS_STK *OSTCBStkBottom; /* Pointer to bottom of stack */INT32U OSTCBStkSize; /* Size of task stack (in number of stack elements) */INT16U OSTCBOpt; /* Task options as passed by OSTaskCreateExt() */INT16U OSTCBId; /* Task ID (0..65535) */ #endifstruct os_tcb *OSTCBNext; /* Pointer to next TCB in the TCB list */struct os_tcb *OSTCBPrev; /* Pointer to previous TCB in the TCB list */#if (OS_EVENT_EN)OS_EVENT *OSTCBEventPtr; /* Pointer to event control block */ #endif#if (OS_EVENT_EN) (OS_EVENT_MULTI_EN 0u)OS_EVENT **OSTCBEventMultiPtr; /* Pointer to multiple event control blocks */ #endif#if ((OS_Q_EN 0u) (OS_MAX_QS 0u)) || (OS_MBOX_EN 0u)void *OSTCBMsg; /* Message received from OSMboxPost() or OSQPost() */ #endif#if (OS_FLAG_EN 0u) (OS_MAX_FLAGS 0u) #if OS_TASK_DEL_EN 0uOS_FLAG_NODE *OSTCBFlagNode; /* Pointer to event flag node */ #endifOS_FLAGS OSTCBFlagsRdy; /* Event flags that made task ready to run */ #endifINT32U OSTCBDly; /* Nbr ticks to delay task or, timeout waiting for event */INT8U OSTCBStat; /* Task status */INT8U OSTCBStatPend; /* Task PEND status */INT8U OSTCBPrio; /* Task priority (0 highest) */INT8U OSTCBX; /* Bit position in group corresponding to task priority */INT8U OSTCBY; /* Index into ready table corresponding to task priority */OS_PRIO OSTCBBitX; /* Bit mask to access bit position in ready table */OS_PRIO OSTCBBitY; /* Bit mask to access bit position in ready group */#if OS_TASK_DEL_EN 0uINT8U OSTCBDelReq; /* Indicates whether a task needs to delete itself */ #endif#if OS_TASK_PROFILE_EN 0uINT32U OSTCBCtxSwCtr; /* Number of time the task was switched in */INT32U OSTCBCyclesTot; /* Total number of clock cycles the task has been running */INT32U OSTCBCyclesStart; /* Snapshot of cycle counter at start of task resumption */OS_STK *OSTCBStkBase; /* Pointer to the beginning of the task stack */INT32U OSTCBStkUsed; /* Number of bytes used from the stack */ #endif#if OS_TASK_NAME_EN 0uINT8U *OSTCBTaskName; #endif#if OS_TASK_REG_TBL_SIZE 0uINT32U OSTCBRegTbl[OS_TASK_REG_TBL_SIZE]; #endif } OS_TCB;2、任务调度实现 2.1、将任务优先级进行分组 因为ucosii最大优先级数量为64个所以可以分成8组每组8个优先级。 当一个任务被创建成功之后它的组号由优先级的高三位决定(bit5 bit4 bit3)它在组内的编号由优先级的低三位决定(bit2 bit1 bit0)如下 #if OS_LOWEST_PRIO 63u /* Pre-compute X, Y */ptcb-OSTCBY (INT8U)(prio 3u); // 组ptcb-OSTCBX (INT8U)(prio 0x07u); // 组内编号 #else 2.2、任务就绪表 ucosii对任务优先级的调度管理是通过查询任务就绪表进行的。任务就绪表里面保存着当前所有任务的就绪状态如下 OSRdyTbl[8]说明 1它是uint8的数据类型。它的长度是8每一个元素代表一个组 比如 OSRdyTbl[0]代表第0组 OSRdyTbl[1]代表第1组OSRdyTbl[2]代表第2组……以此类推。2每一个元素中的每一个位bit代表组内的任务的就绪状态1为就绪0为未就绪。 打个比方 1当优先级为12 的任务就绪时那么对应的OSRdyTbl[1]的第4位bit绝对等于1 当整个系统中当只有优先级为12的任务就绪其他所有任务都没有就绪时那么OSRdyTbl[1] 绝对等于0x10。2当优先级为0和1的任务就绪时那么对应的OSRdyTbl[0]的第0位bit以及第1位bit都绝对等于1 当整个系统中当只有优先级为0和1的任务就绪其他所有任务都没有就绪时那么OSRdyTbl[0] 绝对等于0x03。2.3、任务释放CPU使用权 当任务中调用 OSTimeDly( ) 时会让任务进入休眠的状态交出CPU的执行权给到其他就绪任务去执行这个过程就发生了任务的切换。 简单而言就是会把任务就绪表 OSRdyTbl 中对应的任务优先级在组内的编号状态改变从而使任务自身进入休眠状态。代码如下 if (ticks 0u) { /* 0 means no delay! */OS_ENTER_CRITICAL();y OSTCBCur-OSTCBY; /* Delay current task */OSRdyTbl[y] (OS_PRIO)~OSTCBCur-OSTCBBitX;if (OSRdyTbl[y] 0u) {OSRdyGrp (OS_PRIO)~OSTCBCur-OSTCBBitY;}OSTCBCur-OSTCBDly ticks; /* Load ticks in TCB */OS_EXIT_CRITICAL();OS_Sched(); /* Find next task to run! */} 在上面的代码中发现了一个东西OSRdyGrp。这个有什么用呢 OSRdyGrp管理任务就绪组的 OSRdyGrp是INT8U类型的它每一个bit代表一个组只要这个组内有任何一个任务就绪了那对应的这个bit就会被设置为1表示这个组内目前有就绪的任务。否者对应的位为0。 举个例子如下 1系统中只有任务0就绪了那么OSRdyGrp 便等于 0x01二进制00000001。 2系统中有任务0和任务63都就绪了那么OSRdyGrp 便等于 0x81(二进制10000001)。2.4、任务实现调度切换操作 发生一次任务调度是通过 OS_Sched() 进行的。源码如下 void OS_Sched (void) { #if OS_CRITICAL_METHOD 3u /* Allocate storage for CPU status register */OS_CPU_SR cpu_sr 0u; #endifOS_ENTER_CRITICAL();if (OSIntNesting 0u) { /* Schedule only if all ISRs done and ... */if (OSLockNesting 0u) { /* ... scheduler is not locked */OS_SchedNew();OSTCBHighRdy OSTCBPrioTbl[OSPrioHighRdy];if (OSPrioHighRdy ! OSPrioCur) { /* No Ctx Sw if current task is highest rdy */ #if OS_TASK_PROFILE_EN 0uOSTCBHighRdy-OSTCBCtxSwCtr; /* Inc. # of context switches to this task */ #endifOSCtxSwCtr; /* Increment context switch counter */OS_TASK_SW(); /* Perform a context switch */}}}OS_EXIT_CRITICAL(); } 这里的过程如下 1先通过 OS_SchedNew() 找到当前处于就绪状态的最高优先级的任务如下 y OSUnMapTbl[OSRdyGrp]; OSPrioHighRdy (INT8U)((y 3u) OSUnMapTbl[OSRdyTbl[y]]);2然后通过 OS_TASK_SW() 进行任务切换它的过程如下 1OS_TASK_SW 只是一个宏它实际替换的是 OSCtxSw() #define OS_TASK_SW() OSCtxSw()2OSCtxSw()是由汇编实现的 OSCtxSwPUSH {R4, R5}LDR R4, NVIC_INT_CTRL ;触发PendSV异常 (causes context switch)LDR R5, NVIC_PENDSVSETSTR R5, [R4]POP {R4, R5}BX LR 就这样上下文就完成了一次切换。
http://www.dnsts.com.cn/news/66537.html

相关文章:

  • 研究网站平台建设工作动态华仁建设网站
  • php网站留言石家庄的网站开发公司
  • 做一下网站需要什么条件wordpress 默认模版
  • 网站建设怎么宣传免费申请商城网站
  • 购买网站域名空间网站转微信小程序
  • 如何把电脑改成服务器 做网站哈尔滨网络公司招聘信息
  • 用脚手架如何搭建项目做网站哈尔滨网站优化
  • 网站默认后台深圳网络科技有限公司简介
  • 抚顺地区网站建设长沙微信网站开发
  • h5制作网站哪个好资源链接搜索引擎
  • 网站如何做mipwordpress 更改插件样式
  • 贵州省住房和建设厅网网站详情页模板套用
  • 江苏赛华建设监理有限公司网站网页进不去是怎么回事
  • 做电商有哪些网站有哪些新手建站广告联盟赚钱
  • 济南wordpress 建站wordpress搭建工单
  • 手机网站制作建设单网页网站
  • 宜兴市网站建设河南建设工程信息网招标公告
  • 网站开发薪水一般多少钱黄山冬季旅游攻略
  • 做网站是不是需要服务器wordpress苗木模板
  • 嘉兴网站搭建wordpress冷门二次元主题
  • 钦州浦北网站建设wordpress备案号添加到哪里
  • 别人做的网站自己根目录吗企业宽带解决方案
  • 车子网站短链接生成站长工具
  • 秦皇岛新闻最新消息广东网站建设seo优化
  • 内蒙古生态文明建设相关网站网站的备案流程图
  • 石家庄网站app制作网站建设需要几步
  • 建立主题网站的顺序一般是软件开发申请专利流程
  • 专业网站建设制作一家公司可以做几个网站
  • 网站建设品牌营销方正隶变简体可以做网站用么
  • 什么行业要做网站建设推广这些网站怎么做百科