Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
第三周作业
发布于 2019-09-13 14:38:16 浏览:941
订阅该版
总结:经过半个月的学习,完成了RT-Thread的三个任务,和学习32的实验有着很大的差别,不过主要自己的能力没有达标,不过多谢学长和老师的帮助,自己勉强在完成的同时学到了一点皮毛,但是我还会继续学习这个操作系统的,看了一部分书籍,觉得自己得使劲爬呀。 **第三周目标与实现:**  **目标****任务 ****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伪代码:  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(.....) }```部分代码如上。希望明年再报这个课程得时候,由更多得实力吧! 
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
941
关于作者
弱冠而立
这家伙很懒,什么也没写!
提问
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
基于RT-Thread的STM32F4开发第四讲——硬件定时器更新中断(缺失补齐教程)
2
基于RT-Thread的STM32F4开发第三讲——DAC
3
Wireshark抓包EtherCAT报文
4
RISC-V hardfault分析工具,RTTHREAD-RVBACKTRACE 原理讲解
5
基于RT-Thread的STM32G4开发第二讲第二篇——ADC
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
FAL
RTC
rt-smart
I2C_IIC
cubemx
UART
ESP8266
WIZnet_W5500
BSP
ota在线升级
PWM
flash
packages_软件包
freemodbus
潘多拉开发板_Pandora
ADC
GD32
编译报错
定时器
flashDB
keil_MDK
socket
中断
rt_mq_消息队列_msg_queue
Debug
ulog
SFUD
msh
C++_cpp
at_device
本月问答贡献
出出啊
1524
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
821
个答案
179
次被采纳
crystal266
555
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部