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

阿里云服务器做盗版视频网站吗网站开发流程龙岩

阿里云服务器做盗版视频网站吗,网站开发流程龙岩,事业单位网站方案,电子商务网站建设卷子资料来源于硬件家园#xff1a;资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、信号量的概念 1、信号量的基本概念 2、信号量的分类 二、二值信号量的定义与应用 1、二值信号量的定义 2、二值信号量的应用 三、二值信号量的运作机制 1、FreeRTOS任务间二值…资料来源于硬件家园资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、信号量的概念 1、信号量的基本概念 2、信号量的分类 二、二值信号量的定义与应用 1、二值信号量的定义 2、二值信号量的应用 三、二值信号量的运作机制 1、FreeRTOS任务间二值信号量的实现 2、FreeRTOS中断方式二值信号量的实现 四、二值信号量的常用API函数 1、使用二值信号量典型流程与API 2、二值信号量创建与删除 3、任务与中断中二值信号量释放 五、二值信号量编程 1、信号量创建 2、避免串口误同步 3、任务释放信号量 4、任务获取信号量 5、中断释放信号量 6、任务中获取中断释放的信号量 一、信号量的概念 1、信号量的基本概念 消息队列是实现任务与任务或任务与中断间通信的数据结构可类比裸机编程中的数组 信号量是实现任务与任务或任务与中断间通信的机制可以类比裸机编程中的标志位 信号量(semaphore)可以实现任务与任务或任务与中断间的同步功能(二值信号量)、资源管理(计数信号量)、临界资源的互斥访问(互斥信号量)等 信号量是一个非负正数二值信号量与互斥信号量取值范围为0-1计数信号量取值范围是0-N(N1) 0信号量为空所有试图获取它的任务都将处于阻塞状态直到超时退出或其他任务释放信号量 正数表示有一个或多个信号量供获取 2、信号量的分类 二值信号量(同步应用) 计数信号量(资源管理) 互斥信号量(互斥访问) 递归互斥信号量(简要了解即可) 二、二值信号量的定义与应用 1、二值信号量的定义 当信号量被获取了信号量值变为0当信号量被释放了信号量值变为1。 把这种取值只有0与1两种状态的信号量称之为二值信号量。创建二值信号量时系统会为创建的二值信号量分配内存 二值信号量是一种长度为1消息大小为0的特殊消息队列。  因为这个队列只有空或满两种状态而且消息大小为0因此在运用时只需要知道队列中是否有消息即可而无需关注消息是什么。 2、二值信号量的应用 在嵌入式操作系统中二值信号量是任务与任务或任务与中断间同步的重要手段。二值信号量也可以用于临界资源的访问但不建议因为存在任务优先级翻转问题. 任务与任务中同步的应用场景: 假设有一个温湿度传感器每1s采集一次数据那么让它在液晶屏中显示数据这个周期也是1s如果液晶屏刷新的周期是100ms那么此时的温湿度数据还没更新液晶屏根本无须刷新只需要在1s后温湿度数据更新时刷新即可否则CPU就是白白做了多次的无效数据更新操作造成 CPU 资源浪费。如果液晶屏刷新的周期是 10s那么温湿度的数据都变化了10次液晶屏才来更新数据那么这个产品测得的结果就是不准确的所以还是需要同步协调工作在温湿度采集完毕之后进行液晶屏数据的刷新这样得到的结果才是最准确的并且不会浪费 CPU 的资源。 任务与中断中同步的应用场景: 在串口接收中我们不知道什么时候有数据发送过来但如果设置一个任务专门时刻查询是否有数据到来将会浪费CPU资源所以在这种情况下使用二值信号量是很好的办法当没有数据到来时任务进入阻塞态不参与任务的调度;等到数据到来了释放一个二值信号量任务就立即从阻塞态中解除进入就绪态然后在运行时处理数据这样系统的资源就会得到很好的利用。 三、二值信号量的运作机制 1、FreeRTOS任务间二值信号量的实现 任务间二值信号量的实现是指各个任务之间使用信号量实现任务的同步功能。 运行条件 创建 2 个任务 Task1 和 Task2。  创建二值信号量默认的初始值是 0也就是没有可用资源。 运行过程描述如下 任务 Task1 运行过程中调用函数 xSemaphoreTake 获取信号量资源但是由于创建二值信号的初始值是 0没有信号量可以用任务 Task1 将由运行态转到阻塞状态。运行的过程中任务 Task2 通过函数 xSemaphoreGive 释放信号量任务 Task1 由阻塞态进入到就绪态在调度器的作用下由就绪态又进入到运行态实现Task1与Task2的同步功能。 2、FreeRTOS中断方式二值信号量的实现 运行条件 创建 1 个任务 Task1 和一个串口接收中断。  二值信号量的初始值为 0串口中断调用函数 xSemaphoreGiveFromISR 释放信号量任务 Task1调用函数 xSemaphoreTake 获取信号量资源。 运行过程描述如下 任务 Task1 运行过程中调用函数 xSemaphoreTake由于信号量的初始值是 0没有信号量资源可用任务 Task1 由运行态进入到阻塞态。 Task1 阻塞的情况下串口接收到数据进入到了串口中断服务程序在串口中断服务程序中调用函数xSemaphoreGiveFromISR 释放信号量资源信号量数值加 1此时信号量计数值为 1任务 Task1由阻塞态进入到就绪态在调度器的作用下由就绪态又进入到运行态任务 Task1 获得信号量后信号量数值减 1此时信号量计数值又变成了 0。  再次循环执行时任务 Task1 调用函数 xSemaphoreTake 由于没有资源可用再次进入到挂起态等待串口释放二值信号量资源如此往复循环。 实际应用中中断方式的消息机制要注意以下四个问题  中断函数的执行时间越短越好防止其它低于这个中断优先级的异常不能得到及时响应  实际应用中建议不要在中断中实现消息处理用户可以在中断服务程序里面发送消息通知任务在任务中实现消息处理这样可以有效地保证中断服务程序的实时响应。同时此任务也需要设置为高优先级以便退出中断函数后任务可以得到及时执行  中断服务程序中一定要调用专用于二值信号量设置函数即以 FromISR 结尾的函数  如果 FreeRTOS 工程的中断函数中调用了 FreeRTOS 的二值信号量的 API 函数退出的时候要检测是否有高优先级任务就绪如果有就绪的需要在退出中断后进行任务切换 四、二值信号量的常用API函数 1、使用二值信号量典型流程与API 创建二值信号量   xSemaphoreCreateBinary() 释放二值信号量    xSemaphoreGive() 与 xSemaphoreGiveFromISR()  获取二值信号量    xSemaphoreTake() 删除二值信号量    vSemaphoreDelete() 2、二值信号量创建与删除 二值信号量控制块(句柄)二值信号量的句柄为消息队列的句柄因为二值信号量是一种长度为1消息大小为0的特殊消息队列 二值信号量创建 函数原型SemaphoreHandle_t xSemaphoreCreateBinary(void) 函数描述函数 xSemaphoreCreateBinary 用于创建二值信号量。   返回值如果创建成功会返回二值信号量的句柄如果由于 FreeRTOSConfig.h 文件中 heap 大小不足无法为此二值信号量提供所需的空间会返回 NULL。 此函数基于消息队列函数实现 应用举例 二值信号量删除 函数原型void vSemaphoreDelete(void) 函数描述函数 vSemaphoreDelete可用于删除二值信号量。  3、任务与中断中二值信号量释放 任务中二值信号量释放 函数原型xSemaphoreGive( SemaphoreHandle_t xSemaphore ); /* 信号量句柄 */ 函数描述函数 xSemaphoreGive 用于在任务代码中释放信号量。  第 1 个参数是信号量句柄。  返回值如果信号量释放成功返回 pdTRUE否则返回 pdFALSE因为信号量的实现是基于消息队列返回失败的主要原因是消息队列已经满了。 使用这个函数要注意以下问题 1. 此函数是用于任务代码中调用的故不可以在中断服务程序中调用此函数中断服务程序中使用的是xSemaphoreGiveFromISR。 2. 使用此函数前一定要保证用函数 xSemaphoreCreateBinary(), xSemaphoreCreateMutex() 或者xSemaphoreCreateCounting()创建了信号量。 3. 此函数不支持使用 xSemaphoreCreateRecursiveMutex()创建的信号量。 中断中二值信号量释放 函数原型xSemaphoreGiveFromISR ( SemaphoreHandle_t xSemaphore, /* 信号量句柄 */ signed BaseType_t *pxHigherPriorityTaskWoken /* 高优先级任务是否被唤醒的状态保存 */ ) 函数描述函数 xSemaphoreGiveFromISR 用于中断服务程序中释放信号量。  第 1 个参数是信号量句柄。  第 2 个参数用于保存是否有高优先级任务准备就绪。如果函数执行完毕后此参数的数值是 pdTRUE说明有高优先级任务要执行否则没有。  返回值如果信号量释放成功返回 pdTRUE否则返回 errQUEUE_FULL。 使用这个函数要注意以下问题 1. 此函数是基于消息队列函数 xQueueGiveFromISR 实现的#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) \xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) 2. 此函数是用于中断服务程序中调用的故不可以任务代码中调用此函数任务代码中中使用的是xSemaphoreGive。 3. 使用此函数前一定要保证用函数 xSemaphoreCreateBinary()或者 xSemaphoreCreateCounting()创建了信号量。 4. 此函数不支持使用 xSemaphoreCreateMutex ()创建的信号量。 五、二值信号量编程 1、信号量创建 2、避免串口误同步 STM32Cube生成的FreeRTos代码创建二值信号量时默认为1此处释放避免串口误同步 xSemaphoreTake(myBinarySem01Handle,0);//STM32CubeMX生成的FreeRTos代码创建二值信号量时默认为1此处释放避免串口误同步xSemaphoreTake(myBinarySemISRHandle,0);//STM32CubeMX生成的FreeRTos代码创建二值信号量时默认为1此处释放避免串口误同步 3、任务释放信号量 void ReleaseSem_Task(void const * argument) {/* USER CODE BEGIN ReleaseSem_Task */BaseType_t xResult;uint16_t GiveCnt0; //释放计数char buff[50];/* Infinite loop */for(;;){HAL_UART_Transmit(huart2, (uint8_t *)发送同步信号!!! \r\n,18, HAL_MAX_DELAY);xResultxSemaphoreGive(myBinarySem01Handle);if(xResultpdTRUE){sprintf(buff,成功发送二值信号量同步信号次数 %u \r\n,GiveCnt);HAL_UART_Transmit(huart2, (uint8_t *)buff, strlen(buff), HAL_MAX_DELAY);}else{HAL_UART_Transmit(huart2, (uint8_t *)发送同步信号失败 \r\n\r\n, 17, HAL_MAX_DELAY);}osDelay(1000);}/* USER CODE END ReleaseSem_Task */ } 4、任务获取信号量 void BinarySem_Syn_Task(void const * argument) {/* USER CODE BEGIN BinarySem_Syn_Task */BaseType_t xResult;uint16_t TakeCnt0; //获取计数char buff[50];/* Infinite loop */for(;;){HAL_UART_Transmit(huart2,(uint8_t *)等待同步信号无限等待 \r\n, 25, HAL_MAX_DELAY);xResultxSemaphoreTake(myBinarySem01Handle,portMAX_DELAY);if(xResultpdTRUE){sprintf(buff,成功接收到二值信号量同步信号次数 %u \r\n\r\n,TakeCnt);HAL_UART_Transmit(huart2, (uint8_t *)buff, strlen(buff), HAL_MAX_DELAY);}}/* USER CODE END BinarySem_Syn_Task */ } 5、中断释放信号量 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {BaseType_t xHigherPriorityTaskWoken pdTRUE;if(huart-Instancehuart2.Instance){xSemaphoreGiveFromISR(myBinarySemISRHandle,xHigherPriorityTaskWoken);//如果有高优先级任务就绪执行一次任务切换portYIELD_FROM_ISR(xHigherPriorityTaskWoken);} } 6、任务中获取中断释放的信号量 void BinarySemSyneISR_Task(void const * argument) {/* USER CODE BEGIN BinarySemSyneISR_Task */BaseType_t xResult;uint16_t TakeCnt0; //获取计数char buff[50];char rxBuff[10];/* Infinite loop */for (;;){HAL_UART_Receive_IT(huart2, (uint8_t*) rxBuff, strlen(rxBuff));HAL_UART_Transmit(huart2, (uint8_t*) 等待串口中断同步信号无限等待 \r\n, 21,HAL_MAX_DELAY);xResult xSemaphoreTake(myBinarySemISRHandle, portMAX_DELAY);if (xResult pdTRUE){sprintf(buff, 成功接收到二值信号量同步信号次数 %u \r\n\r\n, TakeCnt);HAL_UART_Transmit(huart2, (uint8_t*) buff, strlen(buff),HAL_MAX_DELAY);sprintf(buff, 成功接收到串口数据 %s \r\n\r\n, rxBuff);HAL_UART_Transmit(huart2, (uint8_t*) buff, strlen(buff),HAL_MAX_DELAY);}}/* USER CODE END BinarySemSyneISR_Task */ }
http://www.hkea.cn/news/14479270/

相关文章:

  • 网站运行平台包括关于做网站的创新创业策划书
  • 一级a做爰片2017免费网站南通公司做网站
  • 外贸公司有必要建设网站吗做网站的公司前三名
  • 网站建设哪家好 需要多少钱网站建设发展好不好
  • 怎样在国外网站做推广网站建设观点
  • 做网站 业务流程图深圳网络营销方法
  • 网站有哪些区别是什么莆田百度seo公司
  • 黑龙江省华龙建设有限公司网站整站优化要多少钱
  • 网站广告是内容营销吗做相同性质的网站算侵权吗
  • 深圳网站搜索网站内容设计是什么
  • 青海省制作网站专业抖音开放平台是什么
  • 东莞公司网站制作wordpress怎么换行
  • 文化建设成就付费做网站关键词优化是怎么做的呀
  • 网站的主题有哪些长沙个人网站建设
  • 单页面网站设计wordpress主题大神
  • 金融平台网站开发网站建设方
  • 建立网站的连接结构有哪几种形式深圳那家做网站好
  • 诸城建设局网站网站制作公司交接网站
  • 做网站得叫什么软件值得浏览的外国网站
  • 怎么知道网站有没有备案湖南网站优化推广
  • 公司有网站域名 如何做网站wordpress固定链接怎么不能改
  • 长沙网站建设公司招聘个人秀网站
  • 有没有单纯做旅游攻略的网站上海巨型网站建设
  • 网站建设正文字体多大合适wordpress怎么让文章只显示摘要
  • 网站首页菜单栏曲阜文化建设示范区网站
  • 洪梅镇网站建设公司做百度推广需要网站吗
  • 西乡做网站价格网站建设与应用 教案
  • 郑州知名做网站公司有哪些网站建设如何添加歌曲
  • 网站建议怎么写效果图制作收费标准
  • 滨州做网站建设济南建设网官网招聘信息