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

衡水网站建设服务商南通网站建设兼职

衡水网站建设服务商,南通网站建设兼职,网站建设的代码,免费发外链平台任务优先级和Tick 在FreeRTOS中#xff0c;任务的优先级和Tick是两个关键的概念#xff0c;它们直接影响任务的调度和执行。 任务优先级 每个任务都被分配一个优先级#xff0c;用于决定任务在系统中的调度顺序。 优先级是一个无符号整数#xff0c;通常从0开始#xff0… 任务优先级和Tick 在FreeRTOS中任务的优先级和Tick是两个关键的概念它们直接影响任务的调度和执行。 任务优先级 每个任务都被分配一个优先级用于决定任务在系统中的调度顺序。 优先级是一个无符号整数通常从0开始数值越小优先级越高。最高优先级是0最低是configMAX_PRIORITIES - 1。 优先级的取值范围是0~(configMAX_PRIORITIES – 1)数值越大优先级越高。 FreeRTOS的调度器可以使用2种方法来快速找出优先级最高的、可以运行的任务。使用不同的方法时configMAX_PRIORITIES 的取值有所不同。 1通用方法         使用C函数实现对所有的架构都是同样的代码。对configMAX_PRIORITIES的取值没有限制。但是configMAX_PRIORITIES的取值还是尽量小因为取值越大越浪费内存也浪费时间。configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为0、或者未定义时使用此方法。2架构相关的优化的方法         架构相关的汇编指令可以从一个32位的数里快速地找出为1的最高位。使用这些指令可以快速找出优先级最高的、可以运行的任务。使用这种方法时configMAX_PRIORITIES的取值不能超过32。configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为1时使用此方法。 在FreeRTOS中优先级为0的任务是IDLE任务用于在没有其他任务执行时占用CPU。 任务的创建时通过指定参数设置任务的优先级如下所示 xTaskCreate(vTask1, Task1, configMINIMAL_STACK_SIZE, NULL, 1, Task1_Handle); Tick Tick是FreeRTOS内核用于计时和任务调度的基本时间单元。 FreeRTOS通过硬件定时器或者软件定时器每隔一定时间即Tick间隔产生一次中断。 Tick的间隔由configTICK_RATE_HZ定义它表示每秒钟产生的Tick数。 关系 任务的调度是基于优先级的具有更高优先级的任务将在具有较低优先级的任务之前执行。 Tick间隔决定了系统时钟的精度同时也影响了任务的延时和时间控制。 任务在等待一定时间或进行延时时使用vTaskDelay()等函数参数是以Tick为单位的时间。 vTaskDelay(100 / portTICK_PERIOD_MS); // 暂停任务100ms 任务的优先级和Tick的概念结合在一起形成了FreeRTOS中任务调度和时间控制的基础。通过调整任务的优先级和配置Tick的间隔可以灵活地控制系统中任务的执行顺序和时间行为。 以下是一个基于FreeRTOS的STM32F103芯片的简单优先级实验案例代码。该例子创建了两个任务分别以不同的优先级运行以演示优先级如何影响任务的调度。 #include stm32f1xx.h #include FreeRTOS.h #include task.h// 函数原型 void SystemClock_Config(void); static void MX_GPIO_Init(void);// 任务函数 TaskHandle_t Task1_Handle, Task2_Handle;void vTask1(void *pvParameters) {while (1) {// 任务1的处理逻辑HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 切换LED状态vTaskDelay(1000 / portTICK_PERIOD_MS); // 每隔1秒执行一次} }void vTask2(void *pvParameters) {while (1) {// 任务2的处理逻辑vTaskDelay(2000 / portTICK_PERIOD_MS); // 每隔2秒执行一次} }int main(void) {// 硬件初始化HAL_Init();SystemClock_Config();MX_GPIO_Init();// 创建任务1优先级1xTaskCreate(vTask1, Task1, configMINIMAL_STACK_SIZE, NULL, 1, Task1_Handle);// 创建任务2优先级2xTaskCreate(vTask2, Task2, configMINIMAL_STACK_SIZE, NULL, 2, Task2_Handle);// 启动调度器vTaskStartScheduler();// 代码不应该运行到这里如果运行到这里说明发生了错误while (1) {// 处理错误} }// 系统时钟配置 void SystemClock_Config(void) { }// GPIO初始化 static void MX_GPIO_Init(void) { } 在这个例子中任务1和任务2分别在不同的时间间隔内切换LED的状态。任务1的优先级较高它每隔1秒执行一次而任务2的优先级较低它每隔2秒执行一次。 任务状态 在FreeRTOS中较高优先级的任务将优先于较低优先级的任务执行。任务优先级是通过任务创建时指定的参数来设置的在xTaskCreate函数的第5个参数。在这个案例中任务1的优先级为1任务2的优先级为2。 FreeRTOS中的任务可以处于不同的状态这些状态反映了任务在系统中的执行阶段。任务的状态是通过eTaskState枚举类型表示的定义在task.h头文件中。以下是任务可能的状态 eRunning运行中 任务正在执行。这是任务处于活动状态的时候。 eReady就绪 任务已经准备好执行但由于有其他高优先级任务在运行该任务暂时没有被调度。 eBlocked阻塞 任务由于等待某些事件而被阻塞例如等待定时器、消息队列、信号量等。 eSuspended挂起 任务被显式地挂起不再参与调度。 eDeleted已删除 任务已被删除但其资源尚未被释放。 eInvalid无效 无效状态通常用于表示错误或未知状态。 你可以使用eTaskGetState函数来获取任务的当前状态。以下是一个示例代码 #include FreeRTOS.h #include task.hTaskHandle_t xTaskHandle;void vTaskFunction(void *pvParameters) {while (1) {// 任务的处理逻辑} }int main(void) {// 创建任务xTaskCreate(vTaskFunction, Task, configMINIMAL_STACK_SIZE, NULL, 1, xTaskHandle);// 启动调度器vTaskStartScheduler();// 代码不应该运行到这里如果运行到这里说明发生了错误while (1) {// 处理错误} }void vApplicationIdleHook(void) {// 空闲钩子函数eTaskState taskState eTaskGetState(xTaskHandle);switch (taskState) {case eRunning:// 任务正在运行break;case eReady:// 任务就绪break;case eBlocked:// 任务被阻塞break;case eSuspended:// 任务被挂起break;case eDeleted:// 任务已删除break;case eInvalid:// 无效状态break;} } 在这个例子中vApplicationIdleHook是一个空闲钩子函数用于在系统空闲时检查任务的状态。函数eTaskGetState返回任务的当前状态然后可以根据任务的状态进行相应的处理。 阻塞状态Blocked State 在FreeRTOS中任务的阻塞状态Blocked State表示任务由于等待某些事件而无法执行。任务可以因为多种原因而被阻塞包括等待定时器、等待消息队列、等待信号量等。当任务处于阻塞状态时它将不会被调度执行直到满足了其阻塞条件。 以下是几个常见的阻塞状态的示例 等待定时器 // 创建定时器 TimerHandle_t xTimer xTimerCreate(MyTimer, pdMS_TO_TICKS(1000), pdTRUE, 0, vTimerCallback);// 启动定时器在任务中使用xTimerPendFunctionCallFromISR等函数 xTimerStart(xTimer, 0); 在任务中可能会使用xTimerPendFunctionCallFromISR等函数等待定时器的超时事件。 等待消息队列 // 创建消息队列 QueueHandle_t xQueue xQueueCreate(5, sizeof(int));// 在任务中等待消息队列 xQueueReceive(xQueue, data, portMAX_DELAY); 任务通过xQueueReceive函数等待消息队列中的消息如果队列为空任务将被阻塞直到队列中有数据。 等待信号量 // 创建信号量 SemaphoreHandle_t xSemaphore xSemaphoreCreateBinary();// 在任务中等待信号量 xSemaphoreTake(xSemaphore, portMAX_DELAY); 任务通过xSemaphoreTake函数等待信号量如果信号量被其他任务取得当前任务将被阻塞直到信号量可用。 在上述示例中portMAX_DELAY表示任务将一直等待直到满足其阻塞条件为止。任务也可以使用超时值来设置阻塞的最大等待时间。一旦阻塞条件得到满足任务将被置为就绪状态等待调度器调度执行。 暂停状态Suspended State 在FreeRTOS中任务的暂停状态Suspended State表示任务被显式地挂起使得该任务不再参与调度即不会被执行。任务在创建后可以通过调用vTaskSuspend()函数将其挂起然后通过调用vTaskResume()函数将其恢复执行。 以下是一个简单的示例代码演示了任务的暂停和恢复 #include FreeRTOS.h #include task.hTaskHandle_t xTaskHandle;void vTaskFunction(void *pvParameters) {while (1) {// 任务的处理逻辑} }int main(void) {// 创建任务xTaskCreate(vTaskFunction, Task, configMINIMAL_STACK_SIZE, NULL, 1, xTaskHandle);// 启动调度器vTaskStartScheduler();// 代码不应该运行到这里如果运行到这里说明发生了错误while (1) {// 处理错误} }// 在某个事件或条件下挂起任务 void vSuspendTask(void) {vTaskSuspend(xTaskHandle); }// 在某个事件或条件下恢复任务 void vResumeTask(void) {vTaskResume(xTaskHandle); } 在这个例子中vTaskSuspend()函数用于挂起任务vTaskResume()函数用于恢复任务。通常这样的操作可以用于在某些条件满足或事件发生时挂起任务然后在其他条件下恢复任务的执行。 需要注意的是挂起任务不会立即停止任务的执行而是在任务下一次被调度执行时生效。此外挂起任务并不会释放任务所占用的资源因此在使用这些函数时需要谨慎以免引起资源泄漏。 就绪状态(Ready) 在FreeRTOS中任务的就绪状态Ready State表示任务已经准备好被调度执行但由于有其他高优先级的任务正在运行该任务暂时还未被调度。 在FreeRTOS中任务被创建后它的状态一开始就是就绪状态等待调度器来选择合适的时机执行它。任务的就绪状态可以由以下几种情况触发 任务创建 任务被创建后会进入就绪状态等待调度执行。 xTaskCreate(vTaskFunction, Task, configMINIMAL_STACK_SIZE, NULL, 1, xTaskHandle); 任务挂起状态解除 任务从挂起状态Suspended State被恢复后会进入就绪状态。 vTaskResume(xTaskHandle); 等待事件结束 任务等待某个事件的发生一旦事件发生任务从阻塞状态切换到就绪状态。 xSemaphoreTake(xSemaphore, portMAX_DELAY); 任务等待定时器超时 任务等待一个定时器超时一旦超时任务从阻塞状态切换到就绪状态。 xTaskDelay(1000 / portTICK_PERIOD_MS); 在以上例子中xTaskCreate创建了一个任务vTaskResume恢复了一个挂起的任务xSemaphoreTake和xTaskDelay是任务等待事件或超时的示例。 任务的就绪状态是由FreeRTOS调度器根据任务的优先级和调度算法来决定的。当调度器判定某个任务处于就绪状态时该任务将会被调度器选中并执行相应的任务函数。 任务状态转换图
http://www.yutouwan.com/news/173412/

相关文章:

  • 有什么字体设计网站济宁网站建设电话
  • wordpress开启子域名多站怎样在外管局网站做延期付款
  • 网站首页改版费用一个做网站的软件
  • 高端网站建设公司有必要做吗中国城乡建设经济研究所 网站
  • 增城营销网站建设生物医药基地网站建设
  • 枣阳网站建设公司做淘宝网站销售怎么样
  • 公司网站制作招聘.net做网站的优缺点
  • 群辉服务器建设的网站wordpress 怎么安全
  • 网站建设以推广哪个网站可以做c语言的题
  • 西充县住房和城乡建设局网站wordpress文章图片没src地址
  • 宁波江北建设局官方网站浏览器网站建设的步骤过程
  • 昆明公司网站开发徐州做网站建设
  • 免费企业名录搜索高清网站seo
  • 2016市网站建设总结西樵营销网站制作
  • 做网站有前途吗高性能网站建设在线阅读
  • 通州网站建设多少钱科协网站建设的意见
  • 沈阳做网站优化如何通过域名直接访问wordpress
  • dz门户做视频网站南充房产信息查询系统
  • 山西网站建设开发怀化网站网站建设
  • a做爰视频免费网站苏州网站制作排名优化
  • 网站开发时间一般是五级偏黄视频网站建设
  • 杭州滨江网站开发做网站的人月
  • 山东神华网站建设域名解析站长工具
  • php网站开发实用技术课后习题三星网上商城打不开
  • 热门网站排名域名注册查询工具
  • 深圳微商城网站设计多少钱12333公共招聘网
  • 郑州网站开发与建设网站搭建制作
  • 注册个人网站有哪些高端的网站
  • 黑龙江省建设安全监督网站鲜花网站建设
  • 娱乐企业网站建设官网建设银行