Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
[第二期 空气质量分析仪]第3周作业
发布于 2019-09-10 16:20:56 浏览:1251
订阅该版
* 本帖最后由 beebird 于 2019-9-10 16:47 编辑 * 废话 终于完成了本次实战入门学习营的所有作业,挑战了自我。虽然不能说取得多大的胜利,可是内心还是特别的开心,因为好久没有认真学习,没有专心的搞点技术了。接下来的日子我得把亏欠孩子的学习辅导补上,家务的重担分担,领导压下来的工作顶住,如果万幸还能再有点空就去公园听片刻音乐静一静吧。 学习rt-thread第三周完成了以下实践。 **任务 1:实现异步日志** 使用 rt_kprintf() 函数打印时,这个函数是实时打印的,在任务切换的过程中很有可能就被抢断了。所以我们现在实现一个异步日志 mylog(),使用 mylog() 进行异步日志的打印。 本任务的实质是在线程之间传递数据,即数据采集线程发送数据到数据打印线程,线程间数据的传输方式有消息队列、信号及邮箱这几种。本任务使用邮箱的方式。使用邮箱传递数据、命令等信息的方法可见官网的文档,特别清楚,这里就不再赘述。这里谈一下本任务使用邮箱传递信息时大家可能会碰到的一个难点即消息的定义。这个消息的结构体定义需要我们自行设计,根据作业的要求进行设计。作业要求: mylog() 的参数至少有两个 mylog(char* tag, void* data) ,tag 表示数据类型(如 temp),data 表示数据大小。 也就是打印线程解析数据时,一要能分析出是什么传感器,二要能得出该传感器的测量值。其实这个进行合理化设计还是不太容易的,为了早点交作业我是粗略的进行了一个设计。 ```struct mylog_msg { char *tag; int *data; };```在mylog函数中我是这样使用的 ```void mylog(char *tag, int *data) { static struct mylog_msg mb_data_send; mb_data_send.tag = tag; mb_data_send.data = data; rt_mb_send(&mb, (rt_ubase_t)&mb_data_send); /延时1000ms */ rt_thread_mdelay(1000); }```这样设计其他有不少问题,杨老师在作业中要求的其实是void *data,但在实际写代码的过程中碰到一些问题,暂时没法解决所以就偷懒先改成了这样,以后有空再研究了。 在论坛中看到有一个小伙伴是用strcpy、strcat进行的拼接,还有一个小伙伴直接把把两个参数直接打包在一起,使得mylog就只有一个参数。可谓八仙过海各显神通。 好吧,第一个任务就说到这里,下面把第一个任务的截图贴上。 **任务2:系统跑起来** 老师在布置作业时用在线的 plant uml 画的uml 图。简单的概括起来就是: 1.按键控制传感器是否采集数据 2.采集数据后判断是否超出阈值,此时抛出几个事件 3.采集数据后由打印线程打印数据 涉及到的代码1,此处是发送事件 ```static void mq2_entry(void *parameter) { float mq2_data = 0; int mq2_data_conversion = 0; while (1) { if (mq2_state == MQ2_ON) { mq2_data = mq2_read_smoke(); mq2_data_conversion = (int)(mq2_data *100); //rt_kprintf("mq2 smoke sensor data is: %d.%02d
", mq2_data_conversion / 100, mq2_data_conversion % 100); mylog(mb_mq2, &mq2_data_conversion); if (mq2_data_conversion > 0 && mq2_data_conversion <80) { rt_event_send(&event, EVENT_LED1_BLINK); } else if (mq2_data_conversion >= 80) { rt_event_send(&event, EVENT_LED1_ON); } } else if (mq2_state == MQ2_OFF) { //rt_kprintf("mq2_state data is: %d.
", mq2_state); rt_event_send(&event, EVENT_LED1_OFF); } rt_thread_mdelay(100); } }```涉及到的代码2,此处是接收事件 ```static void led_recv_event(void *param) { rt_uint32_t e; while(1) { if (rt_event_recv(&event, EVENT_LED1_ON | EVENT_LED1_OFF | EVENT_LED1_BLINK, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &e) == RT_EOK) { if (e & EVENT_LED1_ON) { led_on(LED1_PIN); } else if (e & EVENT_LED1_OFF) { led_off(LED1_PIN); } else if(e & EVENT_LED1_BLINK) { led_on(LED1_PIN); rt_thread_mdelay(100); led_off(LED1_PIN); led_on(LED1_PIN); rt_thread_mdelay(100); led_off(LED1_PIN); } } } }``` 这样就完成了整个系统的设计,过程中碰到一个问题就是event事件初始化时要注意,在send前必须先初始化,然后如果有多个文件使用时要extern声明。这个问题的排查是我们群里的杨老师提的醒,再次深表感谢。图片暂时不好传,等找台其他电脑试试。 最后说说体会,虽然这次学习营的作业都做完了,但还是有太多的细节问题有待以后慢慢总结、分析、学习。   
查看更多
2
个回答
默认排序
按发布时间排序
beebird
2019-09-11
这家伙很懒,什么也没写!
>看了你的【废话】,看这作业,不得不赞一个啊 --- 谢谢老师:)
撰写答案
登录
注册新账号
关注者
0
被浏览
1.3k
关于作者
beebird
这家伙很懒,什么也没写!
提问
3
回答
16
被采纳
0
关注TA
发私信
相关问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT-thred的stm32h723对应bsp包CubeMX添加其他外设报错
2
RT-Thread中的time溢出问题,时间戳溢出,解决方法
3
ART-PI使用env驱动ETH网卡,pc和板子可以ping通
4
SystemView线程名字不显示
5
只用网页也能跑RT-Smart 无门槛腾讯Cloud studio + smart-build快速构建
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
8
个答案
2
次被采纳
KunYi
8
个答案
1
次被采纳
三世执戟
7
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
chenyaxing
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部