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

网站域名密码大神自己做的下载音乐的网站

网站域名密码,大神自己做的下载音乐的网站,从本地服务入手做本地网站,滁州seo优化在嵌入式系统领域,嵌入式实时操作系统(RTOS) 的应用正日益广泛,采用RTOS能够更合理、更高效地利用CPU资源,FreeRTOS作为一款轻量级且成熟的实时操作系统内核,其核心功能完备,包括任务管理、时间…

在嵌入式系统领域,嵌入式实时操作系统(RTOS) 的应用正日益广泛,采用RTOS能够更合理、更高效地利用CPU资源,FreeRTOS作为一款轻量级且成熟的实时操作系统内核,其核心功能完备,包括任务管理、时间管理(如延时、定时器)、同步机制(信号量、互斥锁)、进程间通信(消息队列)等等。这些特性使其能够很好地满足资源相对有限的中小型嵌入式系统的需求。

i.MX 9352作为NXP 推出的新一代轻量级边缘AI处理器,集成2个Cortex-A55核和1个Cortex-M33实时核,其架构设计充分体现了对实时性与复杂任务处理能力的兼顾。为了帮助开发者充分利用i.MX 9352 M33核的实时能力,其配套的M核SDK包提供的FreeRTOS例程分为两类,一类介绍FreeRTOS系统组件特性,如信号量、互斥量、队列等,另一类是介绍外设接口如何在FreeRTOS使用,我们分别挑选这两类下的例程进行演示。

演示平台:飞凌嵌入式OK-MX9352-C开发板

产品组图

    1、FreeRTOS-generic

    飞凌嵌入式OK-MX9352-C开发板支持FreeRTOS功能特性示例代码如下:

    • freertos_event:任务事件演示例程

    • freertos_queue:队列消息实现任务间通信的演示例程

    • freertos_mutex:互斥锁使用例程

    • freertos_sem:信号量使用例程

    • freertos_swtimer:软件计数器及其回调的用法。

    • freertos_tickless:使用 LPTMR 延时唤醒或者硬件中断唤醒例程

    • freertos_generic:task、queue、swtimer、tick hook 、semaphore 组合利用演示例程。

    因FreeRTOS_generic例程使用的FreeRTOS特性较多,我们重点分析此例程。

    (1)软件实现

    示例程序内容包括:任务创建、队列、软定时器、系统节拍时钟、信号量、异常处理。具体如下:

    任务创建:

    主函数创建了队列发送、接收,信号量三个任务。

    //  创建队列接收任务if(xTaskCreate(prvQueueReceiveTask,"Rx",configMINIMAL_STACK_SIZE+166,NULL,mainQUEUE_RECEIVE_TASK_PRIORITY,NULL)!=pdPASS)// 创建队列发送任务
    if(xTaskCreate(prvQueueSendTask,"TX",configMINIMAL_STACK_SIZE+166, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL) !=pdPASS)// 创建信号量任务
    if(xTaskCreate(prvEventSemaphoreTask,"Sem",configMINIMAL_STACK_SIZE+166,NULL,mainEVENT_SEMAPHORE_TASK_PRIORITY, NULL) != pdPASS)
    

    队列: 

    队列发送任务,阻塞200ms后向队列发送数据;队列接收任务,任务阻塞读取队列,数据读取正确,则打印此时的队列接收数量。

    // 队列发送任务,阻塞200ms后 向队列发送数据 static void prvQueueSendTask(void *pvParameters)  {      TickType_t xNextWakeTime;      const uint32_t ulValueToSend = 100UL;      xNextWakeTime = xTaskGetTickCount();      for (;;)      {          // 任务阻塞,直至200ms延时结束          vTaskDelayUntil(&xNextWakeTime, mainQUEUE_SEND_PERIOD_MS);          // 向队列发送数据,阻塞时间为0表示当队列满的时候就立即返回          xQueueSend(xQueue, &ulValueToSend, 0);      }  } // 队列接收任务,任务阻塞读取队列,数据读取正确,则打印此时的队列接收数量。static void prvQueueReceiveTask(void *pvParameters)  {      uint32_t ulReceivedValue;      for (;;)      {          // 任务一直阻塞,知道队列内读取到数据          xQueueReceive(xQueue, &ulReceivedValue, portMAX_DELAY);          //  队列数据和发送一致,队列接收数量+1 输出此时的队列接收数量          if (ulReceivedValue == 100UL)          {              ulCountOfItemsReceivedOnQueue++;              PRINTF("Receive message counter: %d.\r\n", ulCountOfItemsReceivedOnQueue);  }  }  
    }  

    软定时器:

    设置软定时器周期1s,时间到后,调用回调函数,记录次数并串口打印。

    // 创建软件定时器任务 时间为1s,周期循环  xExampleSoftwareTimer = xTimerCreate(                                       "LEDTimer",                                       mainSOFTWARE_TIMER_PERIOD_MS,                                       pdTRUE,                                       (void *)0,                                       vExampleTimerCallback);  // 启动软件定时器  xTimerStart(xExampleSoftwareTimer, 0);    // 回调函数static void vExampleTimerCallback(TimerHandle_t xTimer)  {      // 每1s进入一次回调函数,计数增加      ulCountOfTimerCallbackExecutions++;      PRINTF("Soft timer: %d s.\r\n", ulCountOfTimerCallbackExecutions);  }

    系统节拍时钟:

    通过设置文件 FreeRTOSConfig.h 中 configTICK_RATE_HZ 设置任务节拍中断频率, 在启动任务调度器时,系统会根据另一个变量CPU的频率configCPU_CLOCK_HZ计算对应写入节拍计数器的值,启动定时器中断。

    // 设置系统时钟节拍为 1000/200=5ms  #define configTICK_RATE_HZ                      ((TickType_t)200)

      

    信号量:

    每个系统节拍时钟中断中,调用函数vApplicationTickHook,累积500次即500*5ms=2.5s后,发送信号量。信号量任务获取信号后,计数并打印累积次数。

    // 系统节拍为5ms,每个500*5ms=2.5s 释放事件信号量  void vApplicationTickHook(void)  {      BaseType_t xHigherPriorityTaskWoken = pdFALSE;      static uint32_t ulCount             = 0;      ulCount++;      if (ulCount >= 500UL)      {          // 在中断中释放事件信号量          xSemaphoreGiveFromISR(xEventSemaphore, &xHigherPriorityTaskWoken);          ulCount = 0UL;      }  } // 任务阻塞等待信号量,收到后,接收次数增加,并通过串口打印  static void prvEventSemaphoreTask(void *pvParameters)  {      for (;;)      {          // 任务阻塞,直到能获取信号量          if (xSemaphoreTake(xEventSemaphore, portMAX_DELAY) != pdTRUE)          {              PRINTF("Failed to take semaphore.\r\n");          }          // 接收到信号量的次数累加          ulCountOfReceivedSemaphores++;          PRINTF("Event task is running. Get semaphore :%d \r\n",ulCountOfReceivedSemaphores);      }  }  

    异常处理:

    当内存分配失败、堆栈发生错误或任务空闲时,进入相应的函数,用户可添加相应的处理函数。​​​​​​​

    // 内存分配失败函数,当内存分配失败时,进入此函数  void vApplicationMallocFailedHook(void)  {      for (;;)          ;  }// 堆栈错误检查函数,当堆栈发生溢出时,进入此函数  void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)  {      (void)pcTaskName;      (void)xTask;      for (;;)          ;  }  // 空闲任务,优先级最低,没有实际意义,只是让CPU有事情做,用户可以自己添加自己的函数  void vApplicationIdleHook(void)  {      volatile size_t xFreeStackSpace;      xFreeStackSpace = xPortGetFreeHeapSize();      if (xFreeStackSpace > 100)      {      }  }  

    (2)实验现象

    ① 编译程序:在uboot手动加载M核程序。

    ② 队列:每隔200ms,队列发送任务发送数据,队列接收任务获取数据,从阻塞态到运行态,打印计数。

    ③ 软定时器:每隔1s,时间到达,调用回调函数,打印计数。

    ④ 信号量:每隔5ms,系统时钟节拍中断调用函数,超过500次后,释放信号量。信号量任务获的信号量,从阻塞态到运行态,打印计数。

    图片

    2、FreeRTOS-外设

    飞凌嵌入式OK-MX9352-C开发板支持外设使用FreeRTOS完成相应功能,示例代码如下:

    • freertos_uart:freertos串口演示例程

    • freertos_lpi2c_b2b:freertos I2C演示例程

    • freertos_lpspi_b2b:freertos SPI演示例程

    因freertos_uart例程使用的FreeRTOS特性比较典型,我们重点分析此例程。

    (1)软件实现

    示例程序内容包括:串口初始化任务、串口发送任务、串口接收任务。具体如下:

    串口初始化任务:

    主要包含串口外设初始化,发送、接收互斥量,发送和接收事件组。串口外设初始化在裸跑串口例程中已展现,此处不再详述。​​​​​​​

    //  创建串口发送互斥量handle->txSemaphore = xSemaphoreCreateMutex();//  创建串口接收互斥量handle->rxSemaphore = xSemaphoreCreateMutex(); // 创建发送事件标志组handle->txEvent     = xEventGroupCreate();// 创建接收事件标志组handle->rxEvent     = xEventGroupCreate();

    串口发送: 

    发送前获取信号量,启动发送流程,在中断中置位发送完成事件标志。发送任务获取到事件后,释放发送信号量。​​​​​​​

    // 1 获取发送信号量  if (pdFALSE == xSemaphoreTake(handle->txSemaphore, 0))   {      return kStatus_Fail;  }  handle->txTransfer.data     = (uint8_t *)buffer;  handle->txTransfer.dataSize = (uint32_t)length;  // 2 阻塞式发送  status = UART_TransferSendNonBlocking(handle->base, handle->t_state, &handle->txTransfer);  if (status != kStatus_Success)  {      (void)xSemaphoreGive(handle->txSemaphore);       return kStatus_Fail;  }  // 3 等待发送完成的事件  ev = xEventGroupWaitBits(handle->txEvent, RTOS_UART_COMPLETE, pdTRUE, pdFALSE, portMAX_DELAY);// 等待并判断多个事件位  if ((ev & RTOS_UART_COMPLETE) == 0U)  {      retval = kStatus_Fail;  }  // 4 发送完成,释放发送信号量  if (pdFALSE == xSemaphoreGive(handle->txSemaphore)) // 释放信号量  {      retval = kStatus_Fail;  }

    串口接收:

    接收前获取信号量,调用串口接收函数,在中断中置位获取事件标志。接收任务获取到事件后,释放接收信号量。​​​​​​​

    // 1获取接收信号量  if (pdFALSE == xSemaphoreTake(handle->rxSemaphore, portMAX_DELAY))    {      return kStatus_Fail;  }  handle->rxTransfer.data     = buffer;  handle->rxTransfer.dataSize = (uint32_t)length;  // 2 串口接收函数  status = UART_TransferReceiveNonBlocking(handle->base, handle->t_state, &handle->rxTransfer, &n);  if (status != kStatus_Success)  {      (void)xSemaphoreGive(handle->rxSemaphore);       return kStatus_Fail;  }  // 3 获取接收事件  ev = xEventGroupWaitBits(handle->rxEvent,RTOS_UART_COMPLETE | RTOS_UART_RING_BUFFER_OVERRUN | RTOS_UART_HARDWARE_BUFFER_OVERRUN, pdTRUE, pdFALSE, portMAX_DELAY);   // 等待并判断接收完成事件位  // 3.1 硬件接收错误  if ((ev & RTOS_UART_HARDWARE_BUFFER_OVERRUN) != 0U)   {      UART_TransferAbortReceive(handle->base, handle->t_state);      (void)xEventGroupClearBits(handle->rxEvent, RTOS_UART_COMPLETE);    // 将接收完成的事件位清零,      retval         = kStatus_UART_RxHardwareOverrun;      local_received = 0;  }  // 3.2 接收缓冲区过载错误  else if ((ev & RTOS_UART_RING_BUFFER_OVERRUN) != 0U)   {      UART_TransferAbortReceive(handle->base, handle->t_state);      (void)xEventGroupClearBits(handle->rxEvent, RTOS_UART_COMPLETE);    // 将接收完成的事件位清零,      retval         = kStatus_UART_RxRingBufferOverrun;      local_received = 0;  }  // 3.3 接收完成  else if ((ev & RTOS_UART_COMPLETE) != 0U)     {      retval         = kStatus_Success;      local_received = length;  }  else  {      retval         = kStatus_UART_Error;      local_received = 0;  }  // 4 释放接收信号量  if (pdFALSE == xSemaphoreGive(handle->rxSemaphore))   {      retval = kStatus_Fail;  

    (2)实验现象

    ① 编译程序,在uboot手动加载M核程序。

    ② 装置上电后,串口打印程序信息,此时通过键盘输入4个字符,M核调试串口将回显,重复输入和回显字符,证明程序运行成功。

    图片

    以上就是在飞凌嵌入式i.MX 9352开发板M核上软件设计FreeRTOS的例程演示,希望能够对各位工程师朋友有所帮助。


    文章转载自:

    http://Q6LL0wB7.wrsnm.cn
    http://bRMbCSG4.wrsnm.cn
    http://4UyMp5S8.wrsnm.cn
    http://gTKYzsw8.wrsnm.cn
    http://lUSVLgGf.wrsnm.cn
    http://dGUa8HwL.wrsnm.cn
    http://RpUYFXwA.wrsnm.cn
    http://EaLlzxTd.wrsnm.cn
    http://6YPo0xlF.wrsnm.cn
    http://LrUYcqle.wrsnm.cn
    http://7Epd9AyQ.wrsnm.cn
    http://weKbXS2Q.wrsnm.cn
    http://drXnf0TK.wrsnm.cn
    http://FdMGQZIo.wrsnm.cn
    http://kYB2lI16.wrsnm.cn
    http://z44dZZmE.wrsnm.cn
    http://uXwAFCv7.wrsnm.cn
    http://i9Zy30wL.wrsnm.cn
    http://hbiVt0lx.wrsnm.cn
    http://xuhKpnM4.wrsnm.cn
    http://dztbPk7s.wrsnm.cn
    http://viF6Oma4.wrsnm.cn
    http://r9qomueM.wrsnm.cn
    http://3yWKyTn0.wrsnm.cn
    http://hZPA5DyB.wrsnm.cn
    http://uuOwH3bY.wrsnm.cn
    http://r2giA4D0.wrsnm.cn
    http://2M0FkUvn.wrsnm.cn
    http://gKs70X8z.wrsnm.cn
    http://0O5VCQYW.wrsnm.cn
    http://www.dtcms.com/wzjs/647718.html

    相关文章:

  1. 网站 邮箱功能 设置免费网站源码大全
  2. 网站开发哪些专业html做的小网站
  3. 想设计一个公司的网站集团企业网站建设方案
  4. 做网站能用本地的数据库嘛石门网站建设
  5. 公司汇报网站建设方案辽阳专业建设网站公司
  6. 做图书馆网站模板diy科技制作网站
  7. 禹州做网站的公司企业大型网站开发建站教程详解
  8. 网站怎样推广 优帮云蒙文网站建设的意义
  9. 素材网站哪个值得买大学生二手书网站开发需求
  10. 摄影图片素材网站php做网站脑图
  11. 网站建设特定开发搜索引擎推广的基本方法有
  12. 手机建个人网站国际市场营销案例100例
  13. 做百科权威网站有哪些wordpress关闭主题提示
  14. 潍坊专升本考试地点抖音视频seo霸屏
  15. 小馋网站建设书wordpress 虚拟货币模块
  16. 自治区住房和城乡建设部网站网站建设合同英文
  17. 闵行网站建设多久能见效果什么网站是专门做评论赚钱的
  18. 网站备案核验号网络营销策划推广方案
  19. 网站建设企业需要符合哪些建寺庙网站模板
  20. 网站建设中请期待青海教育厅门户网站
  21. 广东建设工程注册中心网站化妆品网站制作需要
  22. wordpress 购物网站主题推广公司产品文案该怎么写
  23. 华龙建设部网站查不到销售技巧
  24. 江门网站上排名做网站要哪些人员
  25. 淄博网站建设乐达金融行业seo整站优化
  26. 陕西省信用建设官方网站php做网站需要什么
  27. 什么网站专做店铺wordpress延迟加载
  28. ps手机网站制作广州网络推广营销
  29. 房产网站模板怎么用vps建网站
  30. 儿童早教网站模板云开发