# IoTOS **Repository Path**: jiexunzh/IoTOS ## Basic Information - **Project Name**: IoTOS - **Description**: IoTOS 实践作业 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-06 - **Last Updated**: 2025-04-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IoTOS 实践作业 >使用华为物联网培训IoT实验箱BearPi作为课程实验硬件平台。 ## 课前准备的开发环境 1. 下载安装 IDE 工具 [MDK-ARM](http://www2.keil.com/mdk5/),课程中使用 ARM 的 Clang 编译器 [ArmClang](https://developer.arm.com/docs/100068/0614) ,配置工具[STM 的 CubeMX](https://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html)。 2. 下载安装 [vscode](https://code.visualstudio.com/),课程中的文档和代码都使用 vscode 编辑,熟练使用vscode 请阅读 [vscode 教程](https://geek-docs.com/vscode/vscode-tutorials/what-is-vscode.html)。为了获得所见即所得的 [Markdown](https://help.github.com/articles/github-flavored-markdown/) 语言编辑体验,可以使用 [Typora](http://typora.io/)。 3. 下载安装 git 客户端 [sourcetree](https://www.sourcetreeapp.com/),课程使用 sourcetree 和 [gitee](https://gitee.com/) 作为项目管理和协作系统。 4. git 入门请读 [Git教程](https://www.liaoxuefeng.com/wiki/896043488029600),进阶请阅读 [git 权威指南](https://gitee.com/progit/) 或其 [英文版](https://git-scm.com/book/en/v2)。 5. 在线教材[FreeRTOS 内核实现与应用开发实战—基于STM32](https://doc.embedfire.com/rtos/freertos/zh/latest/index.html)和教材配套的在线代码仓库基于野火的[拂晓开发板的基础freeRTOS](https://gitee.com/Embedfire-freertos/ebf_freertos_base_code_stm32f103_fuxiao)和[拂晓开发板的高级freeRTOS](https://gitee.com/Embedfire-freertos/ebf_freertos_peripheral_code_stm32f103_fuxiao)。 6. Fork 本作业仓库(hstc-cs-IoT/IoTOS)到自己的私有仓库,并在自己仓库创建 homeworks 分支,用于存放自己的代码与报告。每次作业完成后,用代码审核(pull request)给我,其中源分支是你的 homeworks,目标是仓库hstc-cs-IoT/IoTOS的 homeworks 分支。注意:master 分支用于发作业,homeworks 分支用于提交作业! 7. 仓库的目录说明:根目录下的README.md 文件用于发布实践作业要求,随课程进度会不断更新此文件。实验报告书模板目录存放教师发布的各类实验书模板(同学的实验报告书一定不要存放到此目录)。homeworks目录存放同学的实验代码和实验报告,一次实验存放于一个子目录。比如:homework1 目录用于存放实验1 的所有实验代码和文档。 8. 由RASheng编写的[移植手册](./实验报告书模板/移植手册.md),手把手教你移植。 9. 结合 cubeMX 的 freeFTOS 自动生成框架参考[基于 cubeMX 的freeRTOS 指南](https://blog.csdn.net/qq_45396672/article/details/120877303) ## 作业内容 1. 实验一:移植教材[FreeRTOS 内核实现与应用开发实战—基于STM32](https://doc.embedfire.com/rtos/freertos/zh/latest/index.html)中的[任务管理章节的代码](https://gitee.com/Embedfire-freertos/ebf_freertos_base_code_stm32f103_fuxiao/tree/master/16%EF%BC%8C%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86)到 BearPI 。 2. 实验二:基于消息队列的多任务间数据交换 - [x] 创建三个任务:任务1,任务2,任务3。 - [x] 任务1判断按键 1按下时,发送消息给任务3,任务 3读取消息发送到串口。 - [x] 任务2判断按键 2按下时,发送消息给任务3,任务 3读取消息发送到串口。 - [ ] 消息可以是字符串,最好支持中文字符串。 - [x] 任务3 是LED 任务,基于消息发送的数字,控制灯的闪烁时间。消息1表示 1秒;2,3灯表示2秒,3秒。 3. 实验三:多任务之间的信号量协作机制(同步) - [x] 二值信号量实验是在 freeRTOS 中创建了两个任务,一个是获取信号量任务,一个是释放信号量任务,两个任务独立运行,获取信号量任务一直等待另一个 任务释放信号量,其等待时间是 osWaitForever,当获取信号量成功后执行对应的同步操作,当处理完成就立即释放信号量。释放信号量任务利用延时模拟占用信号量,延时的这段时间,另一个任务无法获得信号量,延时结束后释放信号量。获取信号量任务开始运行,然后形成两个任务间的同步,若两个任务间同步成功,则在串口输出相应信息。 - [x] 以上二值信号实验中的任务一改为**多次获取二值信号**,模拟**死锁**。 - [x] 计数信号量实验是模拟停车场运行:在创建信号量的时候初始化5个可用信号量,系统中创建了两个任务。一个是获取信号量任务, 一个是释放信号量任务,两个任务独立运行,获取信号量任务通过按下KEY1进行信号量的获取,模拟停车场停车操作,其等待时 间是0,在串口输出相应信息。释放信号量任务通过按下KEY2进行信号量的释放,模拟停车场取车操作,在串口输出相应信息。 4. 实验四:多任务之间的互斥锁协作机制(互斥) - [x] 模拟优先级翻转实验:在 freeRTOS 中创建了三个任务与一个二值信号量,任务分别是高优先级任务,中优先级任务,低优先级任务,用于模拟产生优先级翻转。低优先级任务在获取信号量的时候,被中优先级打断,中优先级的任务执行时间较长,因为低优先级还未释放信号量,那么高优先级任务就无法获得信号量而进入阻塞态,此时就发生了优先级翻转,任务在运行中通过串口输出相关信息。 - [x] 基于以上优先级翻转实验进行修改,将二值信号替换为互斥锁,目的是为了测试互斥锁的优先级继承机制是否有效?任务在运行中通过串口输出相关信息。 5. 实验五:多事件的综合 - [x] 在 freeRTOS 中创建了两个任务,一个是按键写事件任务,一个是LED读事件任务,两个任务独立运行,写事件任务通过检测两个不同按键的按下情况写入不同的事件,读事件任务则读取这两个事件标志位,并且判断两个事件是否都发生,如果是则LED灯亮并且输出相应信息。等待事件任务的等待时间是LOS_WAIT_FOREVER, 一直在等待事件的发生,等待到事件之后清除对应的事件标记位。此为组合逻辑事件模式。 - [x] 在 freeRTOS 中创建了两个任务,一个是按键写事件任务,一个是LED读事件任务,两个任务独立运行,写事件任务通过检测两个不同按键的按下情况写入不同的事件,读事件任务则读取这两个事件标志位,并且判断两个事件是否先后发生,如果是按键1先按再按按键2则LED灯闪烁并且输出相应信息。如果是按键2先按再按按键1则忽略。此为时序逻辑事件模式。 6. 实验六:软件定时器 - [x] 软件定时器实验是在 freeRTOS 中创建了二个软件定时器,第一个软件定时器是单次模式,2000ms调用一次回调函数,第二个软件定时器是周期模式, 每1000ms调用一次回调函数,在回调函数中输出相关信息。 - [x] 通过获取两个回调函数运行的任务ID和优先级,验证软件定时器的回调函数会在同一个高优先级任务(定时任务)中运行。 ==两个回调函数运行的“任务ID和优先级”应该是一样的?== - [x] 增加第三个周期模式软件定时器,每4ms调用一次回调函数。第二个软件定时器回调函数触发的业务代码运行时长为 10ms。合理安排此业务的任务程序结构。 7. 实验七:freeRTOS 中的中断处理 - [x] freeRTOS 中断非接管模式实现:Key1 和 Key2 分别表示停车入库和停车出库。初始车库有空位 5个。Key1 按下表示一车辆需要进库停车,Key2 按下表示一车辆出库。如果车库停车位满,LED灯快闪。如果停车库有车位,LED灯常亮。 - [ ] freeRTOS 中断接管模式实现:Key1 和 Key2 分别表示停车入库和停车出库。初始车库有空位 5个。Key1 按下表示一车辆需要进库停车,Key2 按下表示一车辆(随机选择某辆车)出库。如果车库停车位满,LED灯快闪。如果停车库有车位,LED灯常亮。 - [ ] 自主选做题:停车计时计费,每个车辆**每秒钟**计费 1分,车辆出库时,输出此车辆停车时间和总计费信息。 - [ ] 比较两种中断方式的差异和优缺点。 ## 课程拓展 >请课程的使用者特别关注以下几点 1. 基于Git 分布式版本管理系统的协作能力。 2. MarKDown 文档的写作能力,请阅读 [MarkDown 写作指南](https://shd101wyy.github.io/markdown-preview-enhanced/#/zh-cn/)。 3. 形成自己的编程风格和规范,课程中会给出一种风格规范。 4. 多个物联网操作系统[freeRTOS](https://gitee.com/freeRTOS/freeRTOS)、[TencentOS-tiny](https://gitee.com/Tencent/TencentOS-tiny)在BearPI或其他MCU上的移植能力。 5. 嵌入式常规仪器(万用表,[逻辑分析仪](https://support.saleae.com/user-guide),[示波器](https://www.tek.com.cn/oscilloscope/tbs1000b-edu-digital-storage-oscilloscope-manual/tbs1000b-and-tbs1000b-edu-series-oscil)等)的使用能力训练。 6. 产品创新和规划能力,培养工程师的商业敏锐度。 > 使用课程时有任何问题和建议,请及时与我们联系,请 pull request 。 HW1-移植、任务管理 HW2-消息队列 HW3-信号量(同步) HW4-信号量(互斥) HW5-事件 HW6-软件定时器