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

如何让google收录网站滨江网站建设制作

如何让google收录网站,滨江网站建设制作,广东色绿色建筑信息平台,淮安做网站.哪家网络公司好目录 1 同步互斥与通信1.1 同步互斥与通信概述1.2 同步与互斥的概念1.3 同步的例子#xff1a;有缺陷1.4 freertos.c源码3. 互斥的例子#xff1a;有缺陷4. 通信的例子#xff1a;有缺陷5. FreeRTOS的解决方案 1 同步互斥与通信 1.1 同步互斥与通信概述 参考《FreeRTOS入门… 目录 1 同步互斥与通信1.1 同步互斥与通信概述1.2 同步与互斥的概念1.3 同步的例子有缺陷1.4 freertos.c源码3. 互斥的例子有缺陷4. 通信的例子有缺陷5. FreeRTOS的解决方案 1 同步互斥与通信 1.1 同步互斥与通信概述 参考《FreeRTOS入门与工程实践(基于DshanMCU-103)》里《第10章 同步互斥与通信》 本章是概述性的内容。可以把多任务系统当做一个团队里面的每一个任务就相当于团队里的一个人。团队成员之间要协调工作进度(同步)、争用会议室(互斥)、沟通(通信)。多任务系统中所涉及的概念都可以在现实生活中找到例子。 各类RTOS都会涉及这些概念任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)等。我们先站在更高角度来讲解这些概念。 1.2 同步与互斥的概念 一句话理解同步与互斥我等你用完厕所我再用厕所。 什么叫同步就是哎哎哎我正在用厕所你等会。 什么叫互斥就是哎哎哎我正在用厕所你不能进来。 同步与互斥经常放在一起讲是因为它们之的关系很大“互斥”操作可以使用“同步”来实现。我“等”你用完厕所我再用厕所。这不就是用“同步”来实现“互斥”吗 再举一个例子。在团队活动里同事A先写完报表经理B才能拿去向领导汇报。经理B必须等同事A完成报表AB之间有依赖B必须放慢脚步被称为同步。在团队活动中同事A已经使用会议室了经理B也想使用即使经理B是领导他也得等着这就叫互斥。经理B跟同事A说你用完会议室就提醒我。这就是使用同步来实现互斥。 有时候看代码更容易理解伪代码如下 void 抢厕所(void){if (有人在用) 我眯一会;用厕所;喂醒醒有人要用厕所吗;}1.3 同步的例子有缺陷 程序在06_create_task_use_params的基础上修改出12_task_sync_exclusion 创建两个任务一个用来执行大量的计算任务另一个永年执行打印函数显示OLED xTaskCreate( //加返回值是 判断任务有没有创建成功CalcTask, //计算任务Task1, //声音任务128, //栈大小NULL, //传入的参数 g_Task1InfoosPriorityNormal, //优先级默认NULL //任务句柄 无); xTaskCreate( //加返回值是 判断任务有没有创建成功LcdPrintTask, //LCD打印任务Task1, //声音任务128, //栈大小g_Task2Info, //传入的参数 g_Task1InfoosPriorityNormal, //优先级默认NULL //任务句柄 无);编写这两个函数 static struct TaskPrintInfo g_Task1Info {0, 0, Task1}; // (0,0),Task1 static struct TaskPrintInfo g_Task2Info {0, 3, Task2}; // (0,3),Task2 static struct TaskPrintInfo g_Task3Info {0, 6, Task3}; // (0,6),Task3static int g_LCDCanUse 1; //默认1 能使用LCD uint32_t g_sum 0; //定义一个计数值 static volatile int g_calc_end 0; // 计算结束标志位,使用volatile不要用编译器优化优化uint64_t g_time 0;void CalcTask(void *params) {uint32_t i 0; //定义一个计数值g_time system_get_ns(); //获取当前系统时间for (i 0; i 10000000; i ){g_sum i;}g_calc_end 1; //计算完成标志位 置位g_time system_get_ns() - g_time; //运行这段任务消耗的时间vTaskDelete(NULL); //计算完成杀死任务 }void LcdPrintTask(void *params) {int len;while (1){LCD_PrintString(0, 0, Waiting);// vTaskDelay(3000);while (g_calc_end 0); //等待/* 打印信息 */if (g_LCDCanUse){g_LCDCanUse 0;LCD_ClearLine(0, 0);len LCD_PrintString(0, 0, Sum: );LCD_PrintHex(len, 0, g_sum, 1);LCD_ClearLine(0, 2);len LCD_PrintString(0, 2, Time(ms): );LCD_PrintSignedVal(len, 2, g_time/1000000); //打印消耗了多长时间g_LCDCanUse 1;}vTaskDelete(NULL); //任务自杀} }这里遇到了bug 程序卡死在while循环里了但是这个变量已经是1了为什么程序会卡死在上面两行汇编语句呢 原因是编译器优化了我们的变量 对这个变量执行while (g_calc_end 0); 这条语句的时候它会读取内存把变量的值放到CPU某个寄存器里以后一直就判断那个寄存器但是这个寄存器得到的是原始的值并没有每次都去读取内存 这个变量是在其他任务里被修改的那我们使用这个变量的时候每次都需要读内存那怎么办呢我们加上一个volatile就可以了 烧录代码运行 计算10000000个数需要2.5S真的是这样的吗 我们现在有两个任务 他们是怎么调度的呢 两个任务优先级相同A任务运行1msB任务运行1msA任务运行1msB任务运行1ms 任务B执行的程序是死等这也耗费了一半的时间在任务B的开始就等待3S左右 vTaskDelay(3000); //开始的时候我先等待3000Tick加上这句等待3S之后就变成了1278ms 确实如此 这个死循环可以用其他方法来代替 等任务A计算完成之后用任务A唤醒任务B使用同步的时候我们需要考虑如何提高处理器的性能让等待的任务阻塞不参与CPU的调度 这节课学习了同步的例子有缺陷的例子 学习视频【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOSFreeRTOS教程 基于STM32以实际项目为导向】 【精准空降到 13:38】 https://www.bilibili.com/video/BV1Jw411i7Fz/?p25share_sourcecopy_webvd_source8af85e60c2df9af1f0fd23935753a933t818 1.4 freertos.c源码 /* USER CODE BEGIN Header */ #include driver_led.h #include driver_lcd.h #include driver_mpu6050.h #include driver_timer.h #include driver_ds18b20.h #include driver_dht11.h #include driver_active_buzzer.h #include driver_passive_buzzer.h #include driver_color_led.h #include driver_ir_receiver.h #include driver_ir_sender.h #include driver_light_sensor.h #include driver_ir_obstacle.h #include driver_ultrasonic_sr04.h #include driver_spiflash_w25q64.h #include driver_rotary_encoder.h #include driver_motor.h #include driver_key.h #include driver_uart.h #include music.h/********************************************************************************* File Name : freertos.c* Description : Code for freertos applications******************************************************************************* attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/ /* USER CODE END Header *//* Includes ------------------------------------------------------------------*/ #include FreeRTOS.h #include task.h #include main.h #include cmsis_os.h/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */BaseType_t ret; // long static TaskHandle_t xSoundTaskHandle; // void * 在全局变量里记录句柄static StackType_t g_pucStackOfLightTask[128]; // 变量前缀的意思是 全局变量g 指针p uint8_t类型uc的StackOfLightTask 光任务的栈 StaticTask_t g_TCBofLightTask; // 光任务的TCB static TaskHandle_t xLightTaskHandle; // void * 在全局变量里记录句柄static StackType_t g_pucStackOfColorTask[128]; // 变量前缀的意思是 全局变量g 指针p uint8_t类型uc的StackOfLightTask 色任务的栈 StaticTask_t g_TCBofColorTask; // 色任务的TCB static TaskHandle_t xColorTaskHandle; // void * 在全局变量里记录句柄/* USER CODE END Variables */ /* Definitions for defaultTask */ osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes {.name defaultTask,.stack_size 128 * 4,.priority (osPriority_t) osPriorityNormal, };/* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */struct TaskPrintInfo{uint8_t x; //定义坐标xuint8_t y; //定义坐标ychar name[16]; //定义要打印输出的内容最多显示16个字符 };static struct TaskPrintInfo g_Task1Info {0, 0, Task1}; // (0,0),Task1 static struct TaskPrintInfo g_Task2Info {0, 3, Task2}; // (0,3),Task2 static struct TaskPrintInfo g_Task3Info {0, 6, Task3}; // (0,6),Task3static int g_LCDCanUse 1; //默认1 能使用LCD uint32_t g_sum 0; //定义一个计数值 static volatile int g_calc_end 0; // 计算结束标志位,使用volatile不要用编译器优化优化uint64_t g_time 0;void CalcTask(void *params) {uint32_t i 0; //定义一个计数值g_time system_get_ns(); //获取当前系统时间for (i 0; i 10000000; i ){g_sum i;}g_calc_end 1; //计算完成标志位 置位g_time system_get_ns() - g_time; //运行这段任务消耗的时间vTaskDelete(NULL); //计算完成杀死任务 }void LcdPrintTask(void *params) {int len;while (1){LCD_PrintString(0, 0, Waiting);vTaskDelay(3000); //开始的时候我先等待3000Tickwhile (g_calc_end 0); //等待/* 打印信息 */if (g_LCDCanUse){g_LCDCanUse 0;LCD_ClearLine(0, 0);len LCD_PrintString(0, 0, Sum: );LCD_PrintHex(len, 0, g_sum, 1);LCD_ClearLine(0, 2);len LCD_PrintString(0, 2, Time(ms): );LCD_PrintSignedVal(len, 2, g_time/1000000); //打印消耗了多长时间g_LCDCanUse 1;}vTaskDelete(NULL); //任务自杀} } /* USER CODE END FunctionPrototypes */void StartDefaultTask(void *argument);void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) *//*** brief FreeRTOS initialization* param None* retval None*/ void MX_FREERTOS_Init(void) {/* USER CODE BEGIN Init */LCD_Init();LCD_Clear();/* USER CODE END Init *//* USER CODE BEGIN RTOS_MUTEX *//* add mutexes, ... *//* USER CODE END RTOS_MUTEX *//* USER CODE BEGIN RTOS_SEMAPHORES *//* add semaphores, ... *//* USER CODE END RTOS_SEMAPHORES *//* USER CODE BEGIN RTOS_TIMERS *//* start timers, add new ones, ... *//* USER CODE END RTOS_TIMERS *//* USER CODE BEGIN RTOS_QUEUES *//* add queues, ... *//* USER CODE END RTOS_QUEUES *//* Create the thread(s) *//* creation of defaultTask */// defaultTaskHandle osThreadNew(StartDefaultTask, NULL, defaultTask_attributes);/* USER CODE BEGIN RTOS_THREADS *//* add threads, ... */// /* 创建任务声 */ // // 先创建一个动态分配内存的任务 // ret xTaskCreate( //加返回值是 判断任务有没有创建成功 // PlayMusic, //孤勇者的函数 // SoundTask, //声音任务 // 128, //栈大小 // NULL, //无传入的参数 // osPriorityNormal, //优先级默认 // xSoundTaskHandle //任务句柄 // );// // /* 创建任务光 */ // // 创建一个静态分配内存的任务 // xLightTaskHandle xTaskCreateStatic( // Led_Test, //LED测试函数PC13以500ms间隔亮灭一次 // LightTask, //光任务 // 128, //栈大小这里提供了栈的大小长度 // NULL, //无传入的参数 // osPriorityNormal, //优先级默认 // g_pucStackOfLightTask, // 静态分配的栈一个buffer这里只提供了首地址长度就是栈的大小最开始栈的类型不对栈的类型uint32_t // g_TCBofLightTask // 取址TCB // ); // // /* 创建任务色 */ // xColorTaskHandle xTaskCreateStatic( // ColorLED_Test, //LED测试函数PC13以500ms间隔亮灭一次 // ColorTask, //光任务 // 128, //栈大小这里提供了栈的大小长度 // NULL, //无传入的参数 // osPriorityNormal, //优先级默认 // g_pucStackOfColorTask, // 静态分配的栈一个buffer这里只提供了首地址长度就是栈的大小 // g_TCBofColorTask // 取址TCB // );xTaskCreate( //加返回值是 判断任务有没有创建成功CalcTask, //计算任务Task1, //声音任务128, //栈大小NULL, //传入的参数 g_Task1InfoosPriorityNormal, //优先级默认NULL //任务句柄 无);xTaskCreate( //加返回值是 判断任务有没有创建成功LcdPrintTask, //LCD打印任务Task1, //声音任务128, //栈大小g_Task2Info, //传入的参数 g_Task1InfoosPriorityNormal, //优先级默认NULL //任务句柄 无);/* USER CODE END RTOS_THREADS *//* USER CODE BEGIN RTOS_EVENTS *//* add events, ... *//* USER CODE END RTOS_EVENTS */ } /* USER CODE BEGIN Header_StartDefaultTask *//*** brief Function implementing the defaultTask thread.* param argument: Not used* retval None*/ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void *argument) {/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */LCD_Init();LCD_Clear();for(;;){//Led_Test();//LCD_Test();//MPU6050_Test(); //DS18B20_Test();//DHT11_Test();//ActiveBuzzer_Test();//PassiveBuzzer_Test();//ColorLED_Test();IRReceiver_Test(); //影//IRSender_Test();//LightSensor_Test();//IRObstacle_Test();//SR04_Test();//W25Q64_Test();//RotaryEncoder_Test();//Motor_Test();//Key_Test();//UART_Test();}/* USER CODE END StartDefaultTask */ }/* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application *//* USER CODE END Application */3. 互斥的例子有缺陷 讲解这个程序06_create_task_use_params的互斥缺陷。 4. 通信的例子有缺陷 5. FreeRTOS的解决方案 正确性 效率等待者要进入阻塞状态 多种解决方案
http://www.w-s-a.com/news/573088/

相关文章:

  • 武进网站建设咨询网站定制公司选哪家
  • 郑州市建设投资集团公司网站深圳企业网站建设推荐公司
  • 天津个人网站备案查询dz网站恢复数据库
  • 关于网站建设的期刊文献宣传片文案
  • 物业网站模板下载wordpress+菜单大小
  • 网站建设案例教程视频空间刷赞网站推广
  • 网站建设借鉴做外贸球衣用什么网站
  • 网站建设的前途微信公众号制作网站
  • 做网站之前要安装什么网站改进建议有哪些
  • 网站建设+管理系统开发山东专业网站建设公司
  • 基础微网站开发咨询中国印花图案设计网站
  • 找最新游戏做视频网站天津市招标投标公共服务平台
  • 电影订票网站怎么做注册地址出租多少钱
  • 做网站的规划和设想怎样做能让招聘网站记住密码
  • 建站知乎网站公告建设方案
  • 济南市住房和城乡建设局官方网站淮阳住房和城乡建设网站
  • 网站的设计特点有哪些seo推广要多少钱
  • wordpress开通多站点好处软件开发外包公司的设计一般多少钱
  • 为什么我的网站做不起来微信网页版登录手机版下载
  • 苏州市建设职业中心网站北京网站优化方法
  • 于飞网站开发溧阳 招网站开发
  • 网站中的宣传册翻页动画怎么做长沙有哪些网络平台公司
  • 如何做视频门户网站网站建设模板ppt
  • 青岛黄岛区网站开发百度云盘登录入口
  • 建设银行甘肃省行网站房地产市场调研报告
  • js 网站制作合肥公司网站建设
  • 最好建网站系统的软件wordpress调用模版
  • 个人网站备案地址阿里云增加网站
  • 自己做网站要办手续吗重庆短视频制作公司排名
  • 哪个全球购网站做的好汉中门户网官网