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

网站建设公司的市场营销方案模板下载东莞网站建设0769dt

网站建设公司的市场营销方案模板下载,东莞网站建设0769dt,17做网站骗子,传奇网站源码下载目录前言A. 使用RTOSB.裸机多任务并发前言 在学习各种MCU的时候#xff0c;都是用在main函数里写一个while(1){/* 执行代码 */}#xff0c;这种方式只能一个函数运行完以后再运行另一个函数。 假设需求控制多个模块#xff0c;如显示屏幕信息的同时控制电机#xff0c;还要… 目录前言A. 使用RTOSB.裸机多任务并发前言 在学习各种MCU的时候都是用在main函数里写一个while(1){/* 执行代码 */}这种方式只能一个函数运行完以后再运行另一个函数。 假设需求控制多个模块如显示屏幕信息的同时控制电机还要一边接收按键输入。如果用上面的方式每个模块要排队等待CPU运行就会显的很卡。 那有没有办法每个模块运行固定的时间时间到了运行下一个模块这样单个模块即使特别耗时也不影响其他模块的运行这个方法叫时间片轮转。 想到这个办法很容易但要怎么编写代码呢 A. 使用RTOS 根据不要重复造轮子的理论能用现有的开源代码当然是最好的了。如类STM32常用的操作系统有uCOS, RT-thread(国产)FreeRTOS。 用现成的去官网等地方搜移植教程本文不再详述。 用这些开源代码的问题是如果MCU RAM或ROM太小删减起来就不太方便了这时候手搓一个多任务并发系统的作用来了。 B.裸机多任务并发 时间片轮转的基本思路就是通过定时器(最好是硬件定时器)将CPU的运行时间切片成一个个时间片代码里叫tick然后一个任务每运行一个时间片tick计数加1当前任务运行的tick数已经达到分配给任务的tick数就不再执行当前任务执行下一个任务。 先定义一个最任务结构体至少包括任务主体函数分配给任务的时间片tick数和当前运行已经消耗的时间片tick计数。用结构体就是为了方便扩展用的还可以增加参数比如任务使能任务偏移量等。这样就使任务执行更加灵活。 typedef void (*Func)(void); typedef struct task_info_t {Func func; /* 任务主体函数 */uint16_t task_tick; /* 分配给任务的时间片tick数 */uint16_t tast_tick_cnt; /* 当前运行已经消耗的时间片tick计数 */ } TaskInfo_t;初学者 typedef void (*Func)(void); 看不懂这个是定义一种函数类型这种函数类型是void (*)(void)型的给他取个别名叫Func. 相当于下面这种写法 不清楚的看这篇文章typedef void *(Func)(void)用法 typedef struct task_info_t {void (*func)(void); /* 任务主体函数 */uint16_t task_tick; /* 分配给任务的时间片tick数 */uint16_t tast_tick_cnt; /* 当前运行已经消耗的时间片tick计数 */ } TaskInfo_t;定义好结构体后创建一个结构体数组在数组里初始化任务的参数结构体数组不清楚的看这里结构体数组 TaskInfo_t TaskInfoArray[] {{IdleTask, 10, 0},{LedTask, 20, 0},{KeyTask, 5, 0},{MotorTask, 50, 0},/*任务名 执行时间 运行计数*/ }然后要开启一个定时器中断(我是STM32的用这种方法其他单片机可以用其他方法)比如将时间片定为1ms. 用STM32CubeMX直接配置一个1ms中断的定时器也可以去问ChatGPT。我这里是开了一个定时器TIM3. /*** brief TIM3 Initialization Function* param None* retval None*/ static void MX_TIM3_Init(void) {TIM_MasterConfigTypeDef sMasterConfig {0};TIM_OC_InitTypeDef sConfigOC {0};htim3.Instance TIM3;htim3.Init.Prescaler 850;htim3.Init.CounterMode TIM_COUNTERMODE_UP;htim3.Init.Period 65535;htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_OC_Init(htim3) ! HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(htim3, sMasterConfig) ! HAL_OK){Error_Handler();}sConfigOC.OCMode TIM_OCMODE_TOGGLE;sConfigOC.Pulse 0;sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode TIM_OCFAST_DISABLE;if (HAL_TIM_OC_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_3) ! HAL_OK){Error_Handler();}HAL_TIM_MspPostInit(htim3); }然后设置一个任务运行1ms的标志位定义成全局变量 task1ms_Flag定时器里把这个标志位至1. /*** brief This function handles TIM3 global interrupt.*/ uint8_t task1ms_Flag 0; void TIM3_IRQHandler(void) {task1ms_Flag 1;HAL_TIM_IRQHandler(htim3); }然后在while(1){…}里面写整个任务切换的程序看懂逻辑不复杂 /*** brief The application entry point.* retval int*/ int main(void) {/*初始化代码*/uint8_t i;TaskInfo_t *p_task;while(1){if (0 task1ms_Flag)return; //当前运行结束1ms没到不需要切换任务elsetask1ms_Flag 0; //当task1ms_Flag为1时运行先重置为0for (i 0; i sizeof(TaskInfoArray) / sizeof(TaskInfo_t); i) //sizeof(TaskInfoArray) / sizeof(TaskInfo_t)为任务数每1ms时间片轮转一遍{p_task TaskInfoArray[i]; //从任务0开始任务轮转if( p_task-task_tick_cnt tsk_ptr-tsk_tick ) //当前任务已经消耗tick大于分配的tick{tsk_ptr-func(); //执行当前任务i的函数主体tsk_ptr-tst_tick_cnt tsk_ptr-tst_tick_cnt % tsk_ptr-tsk_tick; //当前任务已经消耗tick减去分配的tick,相当于清零。}else //如果当前任务已经消耗tick小于分配的tick则当前任务已经消耗tick加一{tsk_ptr-tst_tick_cnt; }}} }完成这些配置后就可以写每个任务的执行函数了和RT-thread不一样这些任务函数里不要写while(1) void IdleTask(void) { }void LedTask(void) { }void KeyTask(void) { }void MotorTask(void) { }整个系统的逻辑就是时间片轮转执行Task程序如IdleTask执行10msLedTask执行20msKeyTask执行5msMotorTask执行50ms。 注意每个任务里如果要写延时函数注意延时的总时间不要大于分配的时间片。
http://www.hkea.cn/news/14528220/

相关文章:

  • 三端网站如何做中国电子加工网
  • 福州市建设工程材料价格管理系统网站网站建设公司哪里可以做
  • 模板网站免费昆明网站建设php
  • 瑞安网站建设优化网站建设新技术
  • 网站标题符号的应用wordpress用户注册邮件验证
  • 网站开发厂商wordpress 安装失败
  • 网站上线流程图可以用自己电脑做网站吗
  • 销售产品网站有哪些高校网站建设方案
  • 在国外做购物网站怎么做网站关键词视频
  • 如何使用二级域名做网站阳江招聘网最新招聘信息网
  • 怎么建设自己网站的后台教学网站设计与开发
  • 利用百度网盘自动播放做视频网站短视频网站开发教程
  • 网站建设 的介绍wordpress 网页压缩
  • 企业网站建设外包服务合同阿里云域名注册口令
  • 个人博客网站注册wordpress网站内容
  • 网站开发不足之处建设工程信息平台官网
  • 网站开发业务pptwordpress多个single
  • 网站优化什么意思wordpress必备文件组合
  • 湛江市网站建设北京商场停业最新消息
  • .net开发网站怎么样大连网站的优化
  • 中国蔬菜网网站建设电话历下区住房和城市建设局网站
  • 甪直做网站辽宁工程建设信息网网站
  • 如何做网站搬家wordpress 文章带字段
  • 做修图网站电脑配置开鲁网站seo不用下载
  • 北京外包公司 网站开发360推广登录平台
  • 宁波建设公司网站中国乐清新闻
  • 上海营销型网站建设哪家好网页设计公司背景
  • 做问卷网站好捕鱼游戏网站开发商
  • 电子商务与网站建设实践论文怎么查自己是不是团员
  • 怎么seo网站推广wordpress英文源码