Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
【第三期 空气质量分析仪】第3周作业:MAILBOX+EVENT+SYSTEM
发布于 2019-10-28 12:37:20 浏览:984
订阅该版
本周有二个任务:任务 1:实现异步日志(熟悉 IPC:邮箱的使用)任务 2:系统跑起来(熟悉 IPC:事件集的使用) 第一个任务:实现异步日志rt_kprintf() 这个函数是实时打印的,而且在任务切换的过程中很有可能就被抢断了。所以要实现一个异步日志 mylog(),使用 mylog() 进行异步日志的打印。异步日志,通过邮箱传递信息。最终效果就是:将传感器模块线程中打印数据所使用到的 rt_kprintf() 使用 mylog() 代替,实现异步打印。任务步骤:1:application 下创建一个 mylog.c 的文件,实现函数mylog_init(),该函数 mylog_init() 中创建一个线程,入口函数是 mylog_entry(),该函数中创建一个邮箱 mb,将函数 mylog_init() 放在 main 中进行初始化。2:实现入口函数:mylog_entry(),在该函数中 RT_WAITING_FOREVER 方式接收邮件,接收到邮件调用 rt_kprintf("[%s] data is:%d
"xx,xxx); 进行打印,将邮件内容打印出来。3:在 mylog.c 的文件,实现函数mylog(),mylog() 的参数至少有两个mylog(char* tag, void* data) ,tag 表示数据类型(如 temp),data 表示数据大小。在该函数中发送邮件,邮件内容是线程要打印的参数。这个任务主要就是学会邮箱的使用,根据官方文档RT-THREAD 编程指南中的6.1小节的教程实现起来不是太难。我在实现过程中,第一次是试图用动态的方式创建一个邮件,而不是用官方例程中的静态方式,最后在初始化的时候,一直提示创建失败,由于时间的关系(只能周末做),没有去折腾找原因,还是用回静态方式,一次成功,真香!mylog.c的代码在下一楼,因为帖子又超出长度了。 第二个任务:系统跑起来目前我们的系统还只是各个模块能运行,模块间没关联。现在要做的就是实现整个系统:每次系统中只有一种传感器模块在获取数据,每秒获取一次。key1 按下(奇数次),温湿度传感器开始读数据。当数据正常时,在每秒的开始,闪烁两下,表示正常读取数据。当读取的数据超过设定的范围时,led 一直常亮,表示报警。key1 再次按下(偶数次),温湿度传感器停止读数据,led 熄灭。其他传感器相同的道理实现:key2,key3分别控制剩下的传感器,led2、led3 做指示灯。1:按键与读取数据线程的关系:使用标志位,按下按键,读取数据开始或者停止。实现这个功能只要在按键的回调函数中取反标志位就可以了,按键的中断的促发方式改成下降沿触发,用内部上拉的方式即可。如果误触发严重,那就要做按键防抖程序,官方的软件包里是有的,反正在我的潘多拉开发板上即使不用防抖包,效果已经很好了,所以我的程序中是没有加入按键防抖程序包的。2:读取数据线程与led的关系,读取数据正常,读取一次数据则进行闪烁一次(快速亮灭几下),在这里加入事件集的使用,如果有三个传感器,则有三个事件,在传感器的线程中,根据标志位来开启和关闭传感器的读取程序。如果数据正常则调用LED线程中的led_blink_note(xx_sensor_on)函数发送事件,LED线程中的led_entry()会根据收到的不同事件去执行相应的LED闪烁,所以事件间的逻辑按关系是或,即任何一件事的到来都会触发,触发完了后要清楚事件标志,不然就是一直触发。如果数据不正常,则调用led_on(clour),常亮对应的颜色的灯,表示报警。如果标志位为关闭传感器,则调用led_off(clour),关闭对应颜色的灯。这个任务主要是学会事件集的使用,另外就是按键传感器和LED之间的逻辑关系,因为以前做个类似的功能,所以只要根据官方文档RT-THREAD编程指南中的5.3小节的教程学会事件集,这个任务实现起来难度也不大。另外,第三周的任务书上,最后的二张系统框架图,非常清楚的显示了各个线程间的关系,只要看懂这二张图,代码自然就不是问题。led_alert.c中代码在下下楼,原因一样。最后贴一张三个传感器都打开,并且数值都报警的信息图: ![system.jpg](/uploads/201910/28/123137cysz1yko5rqyk55e.jpg) 至此,RTT的实战学习训练营的课程就结束了,虽然顺利完成了三个星期的各项任务,但是感觉关于RTT还是只学到一点点皮毛而已,要想彻底搞定RTOS,还是需要大量的精力去投入,最重要的是要动手做,光看教程是没有用的,下一步准备学习野火的《RT-Thread内核实现与应用开发实战指南》,另外安利一下潘多拉开发板是真的好用。 PS:感谢二期训练营的学员的论坛发帖,很多错误都是在你们帖子里找到的答案。还有几个厉害高手贴出的程序框架,我的代码都是参考你们的源码然后再修改的,果然站在前人的肩膀上才能看得更远嘛!
查看更多
4
个回答
默认排序
按发布时间排序
xuchengzhu
2019-10-28
这家伙很懒,什么也没写!
``` #include "mylog.h" static struct rt_mailbox mb; static char mb_pool[128]; struct msg { char *tag; rt_uint32_t data; }; void mylog(char* tag, void* data) { struct msg *msg_ptr; msg_ptr = (struct msg*)rt_malloc(sizeof(struct msg)); msg_ptr->tag = tag; msg_ptr->data = (int)data; rt_mb_send(&mb, (rt_ubase_t)msg_ptr); } void mylog_entry(void *param) { struct msg *msg_ptr; while(1) { if(rt_mb_recv(&mb,(rt_uint32_t*)&msg_ptr, RT_WAITING_FOREVER) == RT_EOK) { rt_kprintf("[%s] data is: %d\n", msg_ptr->tag, msg_ptr->data); } rt_free(msg_ptr); } } int mylog_init(void) { rt_err_t ret; static rt_thread_t my_log_tid = RT_NULL; ret = rt_mb_init(&mb, "mailbox", &mb_pool[0], sizeof(mb_pool)/4, RT_IPC_FLAG_FIFO); if (ret != RT_EOK) { rt_kprintf("init mailbox failed.\n"); return -1; } my_log_tid = rt_thread_create("my_log_thread", mylog_entry, RT_NULL, MY_LOG_THREAD_STACK_SIZE, MY_LOG_THREAD_PRIORITY, MY_LOG_THREAD_TIMESLICE); if (my_log_tid != RT_NULL) { rt_thread_startup(my_log_tid); } return RT_EOK; } ```
xuchengzhu
2019-10-28
这家伙很懒,什么也没写!
[i=s] 本帖最后由 xuchengzhu 于 2019-10-28 13:17 编辑 [/i] #include"led_alert.h" structrt_event led_event; voidled_entry(void *parameter){ rt_err_t ret; rt_uint32_t event_now; while(1) { ret = rt_event_recv(&led_event, (LED_EVENT_TEMP_HUMI|LED_EVENT_PM25|LED_EVENT_MQ135), RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &event_now); if(ret == RT_EOK) { if(event_now & LED_EVENT_TEMP_HUMI) { led_blink(RED,200); } if(event_now& LED_EVENT_PM25) { led_blink(GREEN,200); } if(event_now& LED_EVENT_MQ135) { led_blink(BLUE,200); } } } } voidled_blink_note(rt_uint8_t sensor){ switch(sensor) { case TEMP_HUMI_ON: rt_event_send(&led_event,LED_EVENT_TEMP_HUMI); break; case PM25_ON: rt_event_send(&led_event,LED_EVENT_PM25); break; case MQ135_ON: rt_event_send(&led_event,LED_EVENT_MQ135); break; }} intled_init(void){ rt_err_t ret; static rt_thread_t led_event_tid = RT_NULL; rt_pin_mode(LED_RED_PIN, PIN_MODE_OUTPUT); rt_pin_mode(LED_GREEN_PIN,PIN_MODE_OUTPUT); rt_pin_mode(LED_BLUE_PIN, PIN_MODE_OUTPUT); rt_pin_write(LED_RED_PIN, PIN_HIGH); rt_pin_write(LED_GREEN_PIN, PIN_HIGH); rt_pin_write(LED_BLUE_PIN, PIN_HIGH); ret = rt_event_init(&led_event, "LED_ALARM", RT_IPC_FLAG_FIFO); if(ret != RT_EOK) { rt_kprintf("event init failed.\n"); return -1; } led_event_tid = rt_thread_create("Led_Event", led_entry, RT_NULL, 512, 10, 20); if(led_event_tid != RT_NULL) { rt_thread_startup(led_event_tid); } //rt_event_send(&led_event,(1 <<3)); return RT_EOK;} voidled_on(char colour){ switch(colour) { case RED: rt_pin_write(LED_RED_PIN, PIN_LOW); break; case GREEN: rt_pin_write(LED_GREEN_PIN, PIN_LOW); break; case BLUE: rt_pin_write(LED_BLUE_PIN, PIN_LOW); break; default: break; }} 吐槽一下:论坛的代码编辑器太难用了,没有任何提示的吞代码,就上面这段源码,用编辑器编辑了超过三遍,竟然没有一次成功。哎,这么大的公司,论坛也不好好搞一下。
xuchengzhu
2019-10-29
这家伙很懒,什么也没写!
>还有一周呢忘了? --- 你不提醒,我还真忘的一干二净。花式灯,我目前手里只有潘多拉上的三个灯,还有一块液晶屏,这些硬件够用了吧?
撰写答案
登录
注册新账号
关注者
0
被浏览
984
关于作者
xuchengzhu
这家伙很懒,什么也没写!
提问
3
回答
5
被采纳
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
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
15
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部