Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
第三周作业
发布于 2019-09-13 14:38:16 浏览:879
订阅该版
总结:经过半个月的学习,完成了RT-Thread的三个任务,和学习32的实验有着很大的差别,不过主要自己的能力没有达标,不过多谢学长和老师的帮助,自己勉强在完成的同时学到了一点皮毛,但是我还会继续学习这个操作系统的,看了一部分书籍,觉得自己得使劲爬呀。 **第三周目标与实现:** ![667,2](file:///C:/Users/IRONMA~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png) **目标****任务 ****1****:实现异步日志(熟悉 ****IPC****:邮箱的使用)** 最终效果就是:将传感器模块线程中打印数据所使用到的 rt_kprintf() 使用 mylog() 代替,实现异步打印。**任务 ****2****:系统跑起来(熟悉 ****IPC****:事件集的使用)** 现在要做的就是实现整个体统: 每次系统中只有一种传感器模块在获取数据,每秒获取一次。 key1 按下(奇数次),温湿度传感器开始读数据。 当数据正常时,在每秒的开始,闪烁两下,表示正常读取数据。当读取的数据超过设定的范围时,led一直常亮,表示报警。 key1 再次按下(偶数次),温湿度传感器停止读数据。led 熄灭。 其他传感器相同的道理实现:其他的 key2,key3分别控制剩下的传感器。led2、led3 做指示灯。以上,牵扯到按键、数据读取、led常亮报警、led常灭、led闪烁指示: 按键与读取数据线程的关系:- 使用标志位。按下按键,读取数据开始或者停止。 读取数据线程与led的关系:- 读取数据正常,读取一次数据则进行闪烁一次(快速亮灭几下)。在这里加入事件集的使用。- 读取数据不正常,则执行led常亮。- 不读取数据,led常灭。 那么需要修改各个按键的中断回调函数,在回调函数中修改标志位。 在 led_alert.c 中创建一个 led 的线程。在 led_init() 中创建线程,线程入口函数为 led_entry()。在入口函数中判断标志位,并接收事件,并在接收相应事件后实现相应的led闪烁操作。led_blink()需要增加入参,通过入参,执行相应 led的闪烁。led_on()/led_off()也要增加相应的入参,控制不同led亮灭。 **实现任务 ****1****:****异步日志:**1、能调用 mylog() 进行打印,传入要打印的参数。 1.1、application下创建一个 mylog.c 的文件。 实现函数 1:mylog_init()该函数 mylog_init() 中创建一个线程,入口函数是 mylog_entry()该函数中创建一个邮箱 mb将函数 mylog_init()放在 main 中进行初始化 1.2、实现入口函数:mylog_entry() 在该函数中 RT_WAITING_FOREVER 方式接收邮件,接收到邮件调用 进行打印,将邮件内容打印出来。1.3、在 mylog.c 的文件。实现函数 2:mylog() 的参数至少有两个 据大小。在该函数中发送邮件,邮件内容是线程要打印的参数。 2、mylog.c伪代码: ![FastAdmin](https://www.rt-thread.org/qa/forum.php?mod=image&aid=10967&size=300x300&key=964331712813a65d&nocache=yes&type=fixnone) 3、测试:在 main中使用 mylog() 测试,里面传入参数,烧写程序,查看串口终端打印的现象。如下测试举例:(当 mylog() 的两个参数:tag为”main”,data 为一个自加的值时)。 [main]datais:1 [main]data is:2 [main]data is:3... ```#include
#include
#include
static rt_thread_t mylog_thread = RT_NULL; static char mb_poll[32]; static struct rt_mailbox mb; struct msg { char *tag; rt_uint32_t dat; }; static void mylog_entry(void *parameter) { 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
", msg_ptr->tag, msg_ptr->dat); rt_free(msg_ptr); } } } rt_err_t mylog(char *tag, rt_uint32_t data) { struct msg *amsg; amsg = (struct msg *)rt_malloc(sizeof(struct msg)); amsg->tag = tag; amsg->dat = data; rt_mb_send(&mb, (rt_uint32_t)amsg); return RT_EOK; } rt_thread_t mylog_init(void) { rt_err_t result; result = rt_mb_init(&mb, "mylog", &mb_poll[0], sizeof(mb_poll)/4, RT_IPC_FLAG_FIFO); if (result != RT_EOK) { rt_kprintf("init mailbox failed.
"); return RT_NULL; } mylog_thread = rt_thread_create(.....) }```![164858g9kez702lce9cosc.png](/uploads/201909/13/143803hycscsc3fd9g0dsz.png)部分代码如上。希望明年再报这个课程得时候,由更多得实力吧! ![1.jpg](https://oss-club.rt-thread.org/uploads/201909/13/141430ravloo02osp814kl.jpg)
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
879
关于作者
弱冠而立
这家伙很懒,什么也没写!
提问
3
回答
1
被采纳
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
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部