Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
[第3期 空气质量分析仪]第3周作业
发布于 2019-10-29 11:08:54 浏览:803
订阅该版
为期3周的学习营就快结束了,rtthread 还是很值的学习的,学习营只是接触了个皮毛,接下来准备看看书,研究研究具体实现。也非常感谢学习营各位大神的指导。 ** 任务一:** 见下面代码,我这样写 mylog() 传的都是指针,有一个问题就是数据需要立即处理。可能用 malloc 更好,但是并没有看到有人把 malloc 给 free。或者中间用环形队列存数据更好。 mylog.h: ```#ifndef __PM25_TH_H__ #define __PM25_TH_H__ typedef struct __mylog_TypeDef { char* fileStr; void* data; }mylog_TypeDef; typedef mylog_TypeDef* mylog_TypeDef_t; void mylog(char* TAG, void* data); int mylog_init(void); #endif``` mylog.c: ```#include
#include
#include
#include "mylog.h" static rt_thread_t async_tid = RT_NULL; static struct rt_mailbox mb; static char mb_pool[128]; void mylog(char* TAG, void* data) { static mylog_TypeDef g_mylogStruct; g_mylogStruct.fileStr = TAG; g_mylogStruct.data = data; rt_mb_send(&mb, (rt_ubase_t)&g_mylogStruct); } static void mylog_thread_entry(void* param) { mylog_TypeDef_t pstr; while(1){ if(rt_mb_recv(&mb, (rt_ubase_t *)&pstr, RT_WAITING_FOREVER) == RT_EOK){ rt_kprintf("[%s] data is: %d.%d
", pstr->fileStr, (int)*(float*)pstr->data, (int)(*(float*)pstr->data * 10) % 10); } } } int mylog_init(void) { rt_err_t result; result = rt_mb_init(&mb, "mbt", /* 名称是 mbt */ &mb_pool[0], /* 邮箱用到的内存池是 mb_pool */ sizeof(mb_pool) / 4, /* 邮箱中的邮件数目,因为一封邮件占 4 字节 */ RT_IPC_FLAG_FIFO); /* 采用 FIFO 方式进行线程等待 */ if (result != RT_EOK){ rt_kprintf("init mailbox failed.
"); return -1; } async_tid = rt_thread_create("mylog", mylog_thread_entry, RT_NULL, 1024, RT_MAIN_THREAD_PRIORITY - 2, 20 ); if(async_tid != RT_NULL) rt_thread_startup(async_tid); return 0; }``` **任务二:** 我这个框架如下,exti 中断优先级最高,led_entry 及 mylog_thread_entry 其次,pm25_entry 及 temp_humi_entry 最低。led_entry 挂起等待事件,mylog_thread_entry 挂起等待邮件。exti 置位全局变量,led_entry 及 mylog_thread_entry 发送事件及邮件,led_entry 及 mylog_thread_entry 唤醒。 我这个框架感觉有个问题,就是并没有实现rtthread的优势,还是同步方式,没有实现异步方式。我觉得应该 pm25_entry 及 temp_humi_entry 优先级最高,在他们rt_thread_mdelay()的时候,led_entry 及 mylog_thread_entry 才运行,这样比较好。不过功能实现了就懒得改了:lol key.h: ```#ifndef __KEY_H__ #define __KEY_H__ #define PIN_KEY2 GET_PIN(D, 8) // PD8 : KEY2 --> KEY #define PIN_KEY1 GET_PIN(D, 9) // PD9 : KEY1 --> KEY #define PIN_KEY0 GET_PIN(D, 10) // PD10: KEY0 --> KEY typedef enum{ KEY_TURN_OFF, KEY_TURN_ON }KEY_StateTypeDef; extern KEY_StateTypeDef TH_State; extern KEY_StateTypeDef PM25_State; void key_init(); #endif``` key.c: ```#include
#include
#include
#include "led_alert.h" #include "key.h" KEY_StateTypeDef TH_State = KEY_TURN_OFF; KEY_StateTypeDef PM25_State = KEY_TURN_OFF; static void key_cb0(void *args) { static uint8_t i = 0; i++; if(!rt_pin_read(PIN_KEY0)){ if (i & 0x01){ TH_State = KEY_TURN_ON; } else{ TH_State = KEY_TURN_OFF; } } } static void key_cb1(void *args) { static uint8_t i = 0; i++; if(!rt_pin_read(PIN_KEY1)){ if (i & 0x01){ PM25_State = KEY_TURN_ON; } else{ PM25_State = KEY_TURN_OFF; } } } static void key_cb2(void *args) { static uint8_t i = 0; i++; if(!rt_pin_read(PIN_KEY2)){ if (i & 0x01){ led_on(2); } else{ led_off(2); } } } void key_init() { rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT); rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT); rt_pin_mode(PIN_KEY2, PIN_MODE_INPUT); rt_pin_attach_irq(PIN_KEY0, PIN_IRQ_MODE_FALLING, key_cb0, RT_NULL); rt_pin_attach_irq(PIN_KEY1, PIN_IRQ_MODE_FALLING, key_cb1, RT_NULL); rt_pin_attach_irq(PIN_KEY2, PIN_IRQ_MODE_FALLING, key_cb2, RT_NULL); rt_pin_irq_enable(PIN_KEY0, PIN_IRQ_ENABLE); rt_pin_irq_enable(PIN_KEY1, PIN_IRQ_ENABLE); rt_pin_irq_enable(PIN_KEY2, PIN_IRQ_ENABLE); } ``` led_alert.h: ```#ifndef __LED_ALERT_H__ #define __LED_ALERT_H__ #define LED0_PIN GET_PIN(E, 7) #define LED1_PIN GET_PIN(E, 8) #define LED2_PIN GET_PIN(E, 9) #define EVENT_LED0_OFF (1 << 0) #define EVENT_LED0_ON (1 << 1) #define EVENT_LED0_BLINK (1 << 2) #define EVENT_LED1_OFF (1 << 3) #define EVENT_LED1_ON (1 << 4) #define EVENT_LED1_BLINK (1 << 5) extern struct rt_event event; int led_init(); void led_on(uint8_t led); void led_off(uint8_t led); void led_blink(uint8_t led); #endif``` led_alert.c: ```#include
#include
#include
#include "led_alert.h" /* 事件控制块 */ struct rt_event event; static rt_thread_t led_tid = RT_NULL; void led_entry(void *parameter) { rt_uint32_t e; rt_err_t result; while(1){ result = rt_event_recv(&event, (EVENT_LED0_OFF | EVENT_LED0_ON | EVENT_LED0_BLINK | EVENT_LED1_OFF | EVENT_LED1_ON | EVENT_LED1_BLINK), RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &e ); if (result == RT_EOK){ if(e & EVENT_LED0_OFF){ led_off(0); } else if(e & EVENT_LED0_ON){ led_on(0); } else if(e & EVENT_LED0_BLINK){ led_blink(0); } if(e & EVENT_LED1_OFF){ led_off(1); } else if(e & EVENT_LED1_ON){ led_on(1); } else if(e & EVENT_LED1_BLINK){ led_blink(1); } } } } int led_init() { rt_err_t result; /* 初始化事件对象 */ result = rt_event_init(&event, "event", RT_IPC_FLAG_FIFO); if (result != RT_EOK){ rt_kprintf("init event failed.
"); return -1; } rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); led_off(3); led_tid = rt_thread_create("led", led_entry, RT_NULL, 1024, RT_MAIN_THREAD_PRIORITY - 2, 20 ); if(led_tid != RT_NULL) rt_thread_startup(led_tid); return 0; } void led_on(uint8_t led) { switch(led){ case 0: rt_pin_write(LED0_PIN, PIN_LOW); break; case 1: rt_pin_write(LED1_PIN, PIN_LOW); break; case 2: rt_pin_write(LED2_PIN, PIN_LOW); break; default: rt_pin_write(LED0_PIN, PIN_LOW); rt_pin_write(LED1_PIN, PIN_LOW); rt_pin_write(LED2_PIN, PIN_LOW); } } void led_off(uint8_t led) { switch(led){ case 0: rt_pin_write(LED0_PIN, PIN_HIGH); break; case 1: rt_pin_write(LED1_PIN, PIN_HIGH); break; case 2: rt_pin_write(LED2_PIN, PIN_HIGH); break; default: rt_pin_write(LED0_PIN, PIN_HIGH); rt_pin_write(LED1_PIN, PIN_HIGH); rt_pin_write(LED2_PIN, PIN_HIGH); } } void led_blink(uint8_t led) { led_on(led); rt_thread_mdelay(20); led_off(led); // rt_thread_mdelay(200); }```
查看更多
1
个回答
默认排序
按发布时间排序
core571
2019-10-29
这家伙很懒,什么也没写!
pm25.c ``` #include
#include
#include
#include "mylog.h" #include "led_alert.h" #include "key.h" #include "pm25.h" #include "pm25_th.h" static rt_thread_t pm25_tid = RT_NULL; void pm25_entry(void *parameter) { float dens = 0; while(1){ if(PM25_State == KEY_TURN_ON){ dens = gp2y_read_pm25(); if(dens < 560){ rt_event_send(&event, EVENT_LED1_BLINK); } else{ rt_event_send(&event, EVENT_LED1_ON); } mylog("dens (ug/m3)", &dens); } else if(PM25_State == KEY_TURN_OFF){ rt_event_send(&event, EVENT_LED1_OFF); } // dens = gp2y_read_pm25(); // rt_kprintf("dens: %d.%d ug/m3\n", (int)dens, (int)(dens * 10) % 10); rt_thread_mdelay(1000); } } void pm25_init() { gp2y_hw_init(); pm25_tid = rt_thread_create("pm25_tid", pm25_entry, RT_NULL, 1024, RT_MAIN_THREAD_PRIORITY - 1, 20 ); if(pm25_tid != RT_NULL) rt_thread_startup(pm25_tid); } ``` temp_humi_th.c ``` #include
#include
#include
#include "mylog.h" #include "key.h" #include "led_alert.h" #include "temp_humi.h" #include "temp_humi_th.h" static rt_thread_t temp_humi_tid = RT_NULL; static void temp_humi_entry(void *parameter) { float humidity, temperature; while(1){ if(TH_State == KEY_TURN_ON){ aht10_read_humi(&humidity); aht10_read_temp(&temperature); if(humidity < 43){ rt_event_send(&event, EVENT_LED0_BLINK); } else{ rt_event_send(&event, EVENT_LED0_ON); } mylog("humidity (%)", &humidity); mylog("temperature (°C)", &temperature); // rt_kprintf("read aht10 sensor humidity : %d.%d %%\n", (int)humidity, (int)(humidity * 10) % 10); // if( temperature >= 0 ) // { // rt_kprintf("read aht10 sensor temperature: %d.%d°C\n", (int)temperature, (int)(temperature * 10) % 10); // } // else // { // rt_kprintf("read aht10 sensor temperature: %d.%d°C\n", (int)temperature, (int)(-temperature * 10) % 10); // } } else if(TH_State == KEY_TURN_OFF){ rt_event_send(&event, EVENT_LED0_OFF); } rt_thread_mdelay(1000); } } //static void hook_of_scheduler(struct rt_thread* from, struct rt_thread* to) //{ // rt_kprintf("from: %s --> to: %s \n", from->name , to->name); //} void temp_humi_init(void) { // const char *i2c_bus_name = "i2c4"; aht10_hw_init("i2c4"); // rt_scheduler_sethook(hook_of_scheduler); temp_humi_tid = rt_thread_create("temp_humi_tid", temp_humi_entry, RT_NULL, 1024, RT_MAIN_THREAD_PRIORITY - 1, 10 ); if(temp_humi_tid != RT_NULL) rt_thread_startup(temp_humi_tid); } ``` 再次感谢 rtthread 各位大神的指导!
撰写答案
登录
注册新账号
关注者
0
被浏览
803
关于作者
core571
这家伙很懒,什么也没写!
提问
4
回答
6
被采纳
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
【面向零基础】基于星火1号开发板从头学习基于RT-Thread的嵌入式开发 第一讲
2
新版OneNet的星火1号开发板例程适配(下)
3
基于RT-Thread的STM32F4开发第六讲——PWM输出(CH1和CH1N)
4
RT-Thread 携手 Copilot:智能代码审查,加速开源协作
5
重磅预售!RT-Trace调试工具
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
Bootloader
AT
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
FAL
RTC
rt-smart
I2C_IIC
cubemx
UART
ota在线升级
ESP8266
WIZnet_W5500
BSP
PWM
flash
packages_软件包
freemodbus
潘多拉开发板_Pandora
GD32
ADC
定时器
编译报错
flashDB
keil_MDK
socket
中断
rt_mq_消息队列_msg_queue
Debug
ulog
SFUD
msh
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
6
个答案
3
次被采纳
xiaorui
4
个答案
1
次被采纳
tjrong
2
个答案
1
次被采纳
yans
2
个答案
1
次被采纳
miandian_7
1
个答案
1
次被采纳
本月文章贡献
Pai同学
8
篇文章
11
次点赞
Rick98
3
篇文章
10
次点赞
RTT_逍遥
2
篇文章
10
次点赞
WenShan
2
篇文章
1
次点赞
加缪
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部