Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
[第3期 空气质量分析仪]第三周作业
发布于 2019-10-28 21:25:04 浏览:1127
订阅该版
这周作业相对前两周任务量还是比较大的,主要是对线程间通信和邮箱邮件的使用,做起来还是很烧脑的,还是刚开始对内核部分理解的不够深刻, 本次工作的一部分是 异步日志,我主要是使用邮箱内存池,检测邮箱邮件然后实现打印;具体代码如下: ``` #define MP_BLOCK_SIZE RT_ALIGN(sizeof(struct tmp_msg), sizeof(intptr_t)) /* 为了字节对齐 */ /*线程优先级,时间片*/ #define THREAD_PRIORTY 11 #define THREAD_TIMESLICE 5 /* 邮件大小*/ #define size (4) /*静态线程大小*/ static char mylog_stack[4096]; /*线程句柄*/ static struct rt_thread temp_rade_mb; rt_thread_t humi_thread; rt_thread_t pm25_thread; /*邮箱控制块,邮箱大小*/ static char mb_pool[512]; static char mb_humi_pool[512]; static char mb_pm25_pool[512]; static struct rt_mailbox mb_temp; //温度邮箱 static struct rt_mailbox mb_humi; //湿度邮箱 static struct rt_mailbox mb_pm25; //PM2.5邮箱 /*****全局变量声明*****/ extern int humi_switch; extern int temp_switch; extern int pm25_switch; extern int pm25_vol; extern int humi_vol; extern int temp_vol; struct recvdata /* 定义一个结构体存放接收的数据 */ { char *name; float data; }; void mylog(int equipment_sign, char*name, float data) { struct recvdata *temp; temp=(struct recvdata *)malloc(sizeof(struct recvdata)); struct recvdata *humi; humi=(struct recvdata *)malloc(sizeof(struct recvdata)); struct recvdata *pm25; pm25=(struct recvdata *)malloc(sizeof(struct recvdata)); switch(equipment_sign) { case(1): temp->name = name; temp->data = data; temp_vol = data; // rt_kprintf("name:%s
",name); // rt_kprintf("name:%s
",temp->name); if(temp->name != NULL) rt_mb_send(&mb_temp,(rt_uint32_t )temp) ;temp = NULL; break; case(2): humi->name = name; humi->data = data; humi_vol = data; if(humi->name != NULL) rt_mb_send(&mb_pm25,(rt_uint32_t )humi) ; humi = NULL; break; case(3): pm25->name = name; pm25->data = data; pm25_vol = data; if(pm25->name != NULL) rt_mb_send(&mb_pm25,(rt_uint32_t )pm25) ; break; } } /* 读取温度入口函数 */ static void temp_entry(void *param) { struct recvdata *equipment; char str[80]; equipment=(struct recvdata *)malloc(sizeof(struct recvdata)); while(1) { if( temp_switch != 0) if(rt_mb_recv(&mb_temp,(rt_ubase_t *)&equipment,RT_WAITING_FOREVER == RT_EOK)) { sprintf(str, "[%s]data is: %d
",equipment->name,(int)equipment->data); rt_kprintf(str); equipment = RT_NULL; /* 清空数据 */ /* 延时100ms */ rt_thread_mdelay(1000); } } } /* 读取湿度线程入口函数 */ static void read_humi_entry(void *param) { struct recvdata *equipment; char str[80]; equipment=(struct recvdata *)malloc(sizeof(struct recvdata)); while(1) { if( humi_switch != 0) if(rt_mb_recv(&mb_humi,(rt_ubase_t *)&equipment,RT_WAITING_FOREVER == RT_EOK)) { sprintf(str, "[%s]data is: %d
",equipment->name,(int)equipment->data); rt_kprintf(str); equipment = RT_NULL; /* 清空数据 */ /* 延时100ms */ rt_thread_mdelay(1000); } } } static void read_pm25_entry(void *param) { struct recvdata *equipment; char str[80]; equipment=(struct recvdata *)malloc(sizeof(struct recvdata)); while(1) { if( pm25_switch != 0) if(rt_mb_recv(&mb_pm25,(rt_ubase_t *)&equipment,RT_WAITING_FOREVER == RT_EOK)) { sprintf(str, "[%s]data is: %d
",equipment->name,(int)equipment->data); rt_kprintf(str); equipment = RT_NULL; /* 清空数据 */ /* 延时100ms */ rt_thread_mdelay(1000); } } } /* 初始化读取线程 邮箱 */ int mylog_init(void) { /*初始化邮箱(mailbox)*/ rt_err_t result; result = rt_mb_init(&mb_temp, "mb_temp", &mb_pool[0], sizeof(mb_pool)/4,RT_IPC_FLAG_FIFO); if(result != RT_EOK) { rt_kprintf("the mailbox initia failed
"); return -1; } /* shidu-mb */ result = rt_mb_init(&mb_humi, "mb_humi", &mb_humi_pool[0], sizeof(mb_humi_pool)/4,RT_IPC_FLAG_FIFO); if(result != RT_EOK) { rt_kprintf("the mailbox initia failed
"); return -1; } /* pm2.5-mb */ result = rt_mb_init(&mb_pm25, "mb_pm25", &mb_pm25_pool[0], sizeof(mb_pm25_pool)/4,RT_IPC_FLAG_FIFO); if(result != RT_EOK) { rt_kprintf("the mailbox initia failed
"); return -1; } /***************thread**********/ humi_thread = rt_thread_create("humi_thread", read_humi_entry, "humi", 640, RT_THREAD_PRIORITY_MAX / 2, 20); if (humi_thread != RT_NULL) { rt_thread_startup(humi_thread); } pm25_thread = rt_thread_create("pm25_thread", read_pm25_entry, "pm25", 640, RT_THREAD_PRIORITY_MAX / 2, 20); if (pm25_thread != RT_NULL) { rt_thread_startup(pm25_thread); } /* tempture-thread */ rt_thread_init(&temp_rade_mb, "temp_rade_mb", temp_entry, RT_NULL, &mylog_stack[0], sizeof(mylog_stack), RT_THREAD_PRIORITY_MAX /2,THREAD_TIMESLICE); rt_thread_startup(&temp_rade_mb); return 0; }```其它就是按键和led部分了: ``` void key_pin_0(void * args) { rt_thread_mdelay(20); k0_vol++; if(k0_vol%2 == 1) { temp_switch = 1; humi_switch = 0; } else { temp_switch = 0; humi_switch = 0; } } void key_pin_1(void * args) { k1_vol++; if(k1_vol%2 == 1) { temp_switch = 0; humi_switch = 1; } else { temp_switch = 0; humi_switch = 0; } } void key_pin_2(void * args) { k2_vol++; if(k2_vol%2 == 1) { pm25_switch = 1; } else { pm25_switch = 0; } } void key_init(void) { rt_pin_mode(key_0, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq(key_0, PIN_IRQ_MODE_FALLING, key_pin_0, RT_NULL); rt_pin_irq_enable(key_0, PIN_IRQ_ENABLE); rt_pin_mode(key_1, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq(key_1, PIN_IRQ_MODE_FALLING , key_pin_1, RT_NULL); rt_pin_irq_enable(key_1, PIN_IRQ_ENABLE); rt_pin_mode(key_2, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq(key_2, PIN_IRQ_MODE_FALLING , key_pin_2, RT_NULL); rt_pin_irq_enable(key_2, PIN_IRQ_ENABLE); }```led: ```#define temp_threshold 40 #define humi_threshold 70 #define pm25_threshold 3000 extern int pm25_vol; extern int humi_vol; extern int temp_vol; extern int humi_switch; extern int temp_switch; extern int pm25_switch; rt_thread_t led_thread; /*接口可以初始化 led*/ void led_init() { /* set LED0 pin mode to output */ rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); rt_pin_write(LED0_PIN, PIN_HIGH); } /*接口可以点亮 led*/ void led_on() { rt_pin_write(LED0_PIN, PIN_LOW); } /* 接口可以熄灭 led*/ void led_off() { rt_pin_write(LED0_PIN, PIN_HIGH); } /*接口可以使 led 闪烁,200ms 闪烁周期*/ void led_blink() { rt_pin_write(LED0_PIN, PIN_HIGH); rt_thread_mdelay(200); rt_pin_write(LED0_PIN, PIN_LOW); rt_thread_mdelay(200); rt_pin_write(LED0_PIN, PIN_HIGH); rt_thread_mdelay(200); rt_pin_write(LED0_PIN, PIN_LOW); rt_thread_mdelay(200); rt_pin_write(LED0_PIN, PIN_HIGH); } void led_entry(void *param) { while(1) { if(pm25_switch || humi_switch || temp_switch) { rt_kprintf("temp_vol: %d , humi_vol:%d ,pm25_vol:%d",temp_vol,humi_vol,pm25_vol); if(temp_vol > temp_threshold||humi_vol > humi_threshold||pm25_vol > pm25_threshold) { led_on(); } else { led_blink(); } } rt_thread_mdelay(1000); } } void led_star(void) { led_thread = rt_thread_create("led_thread", led_entry, "led", 640, RT_THREAD_PRIORITY_MAX/2-2, 20); if (led_thread != RT_NULL) { rt_thread_startup(led_thread); } }```现象如下:  在做的过程中还是遇到很多问题,现象中也有没解决的传感器切换的过程中会有一个乱码,以及解决过的打印重叠问题,以及线程删除,数据丢失, 这些大部分原因是线程优先级问题以及申请内存空间处理问题,按键控制线程目前还没搞懂为啥出错,所以我暂且使用了标志。这周任务发现很多问题, 我会一一总结下来希望自己能在以后少走弯路,加油!!希望自己能把这个系统越用越好。
查看更多
8
个回答
默认排序
按发布时间排序
zomejy
2019-10-29
这家伙很懒,什么也没写!
>用一个邮箱就行哦 --- 别的邮件不会影响吗
zomejy
2019-10-29
这家伙很懒,什么也没写!
>你可以再试试一个邮箱的情况 --- 好的,我再试试用事件完成
core571
2019-10-29
这家伙很懒,什么也没写!
77 行 97 行 118 行 应该可以不写的,你可以试试哈
core571
2019-10-29
这家伙很懒,什么也没写!
运行时间长了,你的程序会出现堆溢出吗?
zomejy
2019-11-02
这家伙很懒,什么也没写!
>77 行 97 行 118 行 应该可以不写的,你可以试试哈 --- 不定义成指针就可以不写,直接结构体接收
zomejy
2019-11-02
这家伙很懒,什么也没写!
>运行时间长了,你的程序会出现堆溢出吗? --- 不会吧,不应该是覆盖数据吗
撰写答案
登录
注册新账号
关注者
0
被浏览
1.1k
关于作者
zomejy
这家伙很懒,什么也没写!
提问
11
回答
21
被采纳
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_逍遥
9
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
YZRD
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部