防蚊手环移动网站建设上海小程序开发公司哪家好?

张小明 2026/1/10 8:27:32
防蚊手环移动网站建设,上海小程序开发公司哪家好?,新网网站空间到期停了 咋续费,有哪些国外网站做的好的效果图我是嵌入式学习菌#xff0c;一名热爱学习的嵌入式工程师 关注我#xff0c;一起变得更加优秀#xff01; CSDN、B 站视频号同名同步分享嵌入式学习点滴#xff5e; 无捷径唯有坚持#xff0c;愿与你并肩稳步前行#xff01;15篇原创内容公众号要理解二值信号量“先释放…我是嵌入式学习菌一名热爱学习的嵌入式工程师关注我一起变得更加优秀CSDN、B 站视频号同名同步分享嵌入式学习点滴 无捷径唯有坚持愿与你并肩稳步前行15篇原创内容公众号要理解二值信号量“先释放后获取”和互斥量“先获取后释放”的核心差异本质是两者的设计目的和应用场景完全不同二值信号量核心是同步事件通知——一个任务/中断通知另一个任务“某个事件已发生”因此“事件产生方释放信号量”先触发“事件消费方获取信号量”后响应互斥量核心是互斥资源保护——保护多个任务共享的资源如串口、全局变量必须先“抢占锁获取互斥量”才能访问资源用完后“释放锁释放互斥量”否则会导致资源访问混乱。以下结合ESP32ESP-IDF环境给出具体示例并解释顺序的必要性。一、二值信号量先释放、后获取同步场景核心逻辑二值信号量是“事件通知工具”只有当「事件产生方」完成事件如传感器采集完成、数据接收完成才会释放信号量「事件消费方」一直等待信号量直到收到通知才执行后续逻辑。如果反过来“先获取后释放”消费方会因信号量初始值为0而永久阻塞程序完全无法运行。ESP32IDF示例代码同步场景传感器采集→数据处理#includestdio.h#includefreertos/FreeRTOS.h#includefreertos/task.h#includefreertos/semphr.h#includeesp_log.h#defineTAGBIN_SEMstaticSemaphoreHandle_txBinarySemNULL;//任务1事件产生方传感器采集数据完成后释放信号量staticvoidtask_sensor_collect(void*arg){(void)arg;TickType_txLastWakeTimexTaskGetTickCount();constTickType_txPeriodpdMS_TO_TICKS(3000);//3秒采集一次for(;;){vTaskDelayUntil(xLastWakeTime,xPeriod);//模拟传感器采集数据完成事件发生ESP_LOGI(TAG,任务1传感器数据采集完成→释放信号量发通知);xSemaphoreGive(xBinarySem);//先释放事件发生发通知}vTaskDelete(NULL);}//任务2事件消费方等待信号量收到通知后处理数据staticvoidtask_data_process(void*arg){(void)arg;for(;;){//后获取等待“采集完成”的通知信号量xSemaphoreTake(xBinarySem,portMAX_DELAY);ESP_LOGI(TAG,任务2收到信号量→开始处理传感器数据\n);}vTaskDelete(NULL);}voidapp_main(void){//创建二值信号量初始值为0无事件通知xBinarySemxSemaphoreCreateBinary();if(xBinarySemNULL){ESP_LOGE(TAG,信号量创建失败);return;}//创建任务任务1优先级2任务2优先级1确保释放后立即调度xTaskCreate(task_sensor_collect,sensor,2048,NULL,2,NULL);xTaskCreate(task_data_process,process,2048,NULL,1,NULL);}运行效果关键看顺序I(3015)BIN_SEM:任务1传感器数据采集完成→释放信号量发通知I(3015)BIN_SEM:任务2收到信号量→开始处理传感器数据I(6015)BIN_SEM:任务1传感器数据采集完成→释放信号量发通知I(6015)BIN_SEM:任务2收到信号量→开始处理传感器数据为什么必须“先释放后获取”二值信号量初始值为0若任务2先调用xSemaphoreTake()会直接阻塞只有任务1先调用xSemaphoreGive()将信号量置1任务2才能获取到信号量并执行——这正是“事件通知”的核心先有事件后有响应。二、互斥量先获取、后释放互斥场景核心逻辑互斥量是“资源锁”多个任务访问共享资源如串口、全局变量、硬件外设时必须先“上锁获取互斥量”确保只有自己能访问资源用完后“解锁释放互斥量”其他任务才能抢占。如果反过来“先释放后获取”会因“锁未被持有”导致释放失败返回pdFALSE且共享资源会被多个任务同时访问造成数据混乱/打印错乱。ESP32IDF示例代码互斥场景两个任务共享串口打印#includestdio.h#includefreertos/FreeRTOS.h#includefreertos/task.h#includefreertos/semphr.h#includeesp_log.h#defineTAGMUTEX_DEMOstaticSemaphoreHandle_txMutexNULL;//互斥量句柄staticintg_shared_count0;//共享全局变量//任务1访问共享资源先获取互斥量后释放staticvoidtask1_access_resource(void*arg){(void)arg;for(;;){//第一步先获取互斥量上锁→独占共享资源if(xSemaphoreTake(xMutex,portMAX_DELAY)pdTRUE){//临界区访问共享资源全局变量串口打印g_shared_count;ESP_LOGI(TAG,任务1持有互斥量→共享变量值%d,g_shared_count);vTaskDelay(pdMS_TO_TICKS(500));//模拟资源占用时间//第二步释放互斥量解锁→允许其他任务访问xSemaphoreGive(xMutex);ESP_LOGI(TAG,任务1释放互斥量\n);}vTaskDelay(pdMS_TO_TICKS(1000));//任务1执行间隔}vTaskDelete(NULL);}//任务2访问同一个共享资源同样先获取、后释放staticvoidtask2_access_resource(void*arg){(void)arg;for(;;){//第一步先获取互斥量上锁if(xSemaphoreTake(xMutex,portMAX_DELAY)pdTRUE){//临界区访问共享资源g_shared_count;ESP_LOGI(TAG,任务2持有互斥量→共享变量值%d,g_shared_count);vTaskDelay(pdMS_TO_TICKS(500));//模拟资源占用时间//第二步释放互斥量解锁xSemaphoreGive(xMutex);ESP_LOGI(TAG,任务2释放互斥量\n);}vTaskDelay(pdMS_TO_TICKS(1000));//任务2执行间隔}vTaskDelete(NULL);}voidapp_main(void){//创建互斥量ESP-IDF中xSemaphoreCreateMutex()初始值为1未上锁xMutexxSemaphoreCreateMutex();if(xMutexNULL){ESP_LOGE(TAG,互斥量创建失败);return;}//创建两个优先级相同的任务模拟资源竞争xTaskCreate(task1_access_resource,task1,2048,NULL,1,NULL);xTaskCreate(task2_access_resource,task2,2048,NULL,1,NULL);}运行效果关键无资源竞争打印有序I(1015)MUTEX_DEMO:任务1持有互斥量→共享变量值1I(1515)MUTEX_DEMO:任务1释放互斥量I(2015)MUTEX_DEMO:任务2持有互斥量→共享变量值2I(2515)MUTEX_DEMO:任务2释放互斥量I(3015)MUTEX_DEMO:任务1持有互斥量→共享变量值3I(3515)MUTEX_DEMO:任务1释放互斥量若反过来“先释放后获取”会怎样如果把任务1的逻辑改成//错误示例先释放未持有锁后获取xSemaphoreGive(xMutex);//释放未持有的互斥量→返回pdFALSE无效果xSemaphoreTake(xMutex,portMAX_DELAY);运行结果xSemaphoreGive()返回pdFALSE释放失败因为任务1未持有互斥量两个任务会同时进入临界区共享变量打印错乱比如同时打印g_shared_count出现值重复/跳变plaintextI(1015)MUTEX_DEMO:任务1持有互斥量→共享变量值1I(1015)MUTEX_DEMO:任务2持有互斥量→共享变量值1//数据错乱为什么必须“先获取后释放”互斥量初始值为1“未上锁”只有先调用xSemaphoreTake()将其置0“上锁”才能独占共享资源用完后调用xSemaphoreGive()置1“解锁”其他任务才能继续抢占——这是“资源保护”的核心先占锁再用资源用完解锁。三、核心区别总结特性二值信号量互斥量核心目的同步事件通知互斥资源保护初始值0无事件1未上锁操作顺序先释放发通知→后获取收通知先获取上锁→后释放解锁失败后果消费方阻塞无事件响应资源竞争数据/打印错乱典型场景传感器采集→数据处理、中断通知任务多任务访问串口/全局变量/外设一句话记忆二值信号量是“发消息”先有人发释放才能有人收获取互斥量是“借钥匙”先借到钥匙获取才能开门用资源用完还钥匙释放。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

淄博网站的建设创意广告图片

深入探索Apache Web服务器的安装、配置与安全设置 一、Web服务器模块安装与配置 1.1 目的与理论基础 本次操作旨在学习如何安装和更新Web服务器模块、功能及配置,以满足特定需求。主要围绕四个安装包展开:apache - 1.x.x.i386.rpm、php - 4.0.x.x.i386.rpm、mod_php - 4.x…

张小明 2026/1/9 23:54:02 网站建设

网站关键字标签在线设计装修户型图

学习心得:我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了    网络安全教程从web攻防-通用漏洞、漏洞发现、代码审计、权限提升、免杀对抗、信息打点、内网安全…

张小明 2026/1/4 11:20:16 网站建设

建设银行企业网上银行网站自已做的网站怎么做域名解析

目录已开发项目效果实现截图开发技术介绍系统开发工具:核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式&…

张小明 2026/1/5 3:36:36 网站建设

WordPress多站点默认设置做一个公司官网

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2026/1/5 20:34:58 网站建设

网站开发 加密存储 解密 二次计算宝安画册设计公司

JD-GUI 终极指南:Java 字节码反编译完整教程 【免费下载链接】jd-gui A standalone Java Decompiler GUI 项目地址: https://gitcode.com/gh_mirrors/jd/jd-gui JD-GUI 是一款功能强大的独立 Java 反编译工具,能够将编译后的 Java 类文件和 JAR 包…

张小明 2026/1/9 22:39:51 网站建设

运营公众号还是做网站邢台网约车新政策

从 MkDocs 迁移到 Zensical 完整的迁移指南,让你轻松从 MkDocs 过渡到 Zensical 为什么要迁移? MkDocs 的现状 ⚠️ 已停止更新 - MkDocs 和 Material for MkDocs 不再积极开发⚠️ 功能受限 - 缺少现代化功能(即时导航、博客系统等&#x…

张小明 2026/1/9 15:44:49 网站建设