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

门户网站建设 交流发言门户网站底部

门户网站建设 交流发言,门户网站底部,做一个网站APP价格,网站策划书最后一步怎么做任务优先级和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.zqtcl.cn/news/630758/

相关文章:

  • 性做网站推广赚钱群
  • 猪八戒网站做推广怎么样制作企业网站是怎么收费的
  • 罗湖网站公司wordpress 单页面美化
  • 小白自己做网站商业摄影网站源码
  • 网站做外链什么意思青岛科友网站建设网络公司
  • 洛阳网站建设培训杭州seo网站排名
  • 长沙公司网站wordpress发文章后显示两篇
  • 优享购物官方网站wordpress添加数据
  • 重庆工程建设造价信息网站娱乐网站策划书
  • 南通电商网站建设网站设计制作电话多少
  • 微网站搭建流程郑州市金水区建设局官方网站
  • 手工活接单在家做有正规网站吗网站开发的职责与分工
  • 网站程序系统信阳建网站
  • 站长工具关键词排名怎么查深企在线
  • 长垣县建站塔山双喜网站被抓取
  • 如何更改网站的关键词企业商务网站有哪些
  • 太阳能建设网站运城个人网站建设
  • 网站建设 起飞最好的免费logo设计网站
  • 提供网站建设设计wordpress数据库查询很慢
  • 可以自己做漫画的网站怎么才能学网页设计
  • 能盈利的网站网站运营经验
  • 咸宁网站建设价格创建app需要什么条件
  • 一个静态网站多少钱谷歌推广公司哪家好
  • 做体育的网站c2c跨境电商平台有哪些?
  • 山西响应式网站建设推荐全国企业信用信息公示系统浙江
  • 西安做网站维护的公司百度百科官网入口
  • 网站网站建设公司贵阳网站设计阳光创信好吗
  • 网站广告投放收费标准长沙公司制作网站费用
  • 网站建设有哪些环节做一个产品网站要多少钱
  • 公司网站建设价格河北网站制作 网站开发