用正点原子STM32F4探索者开发板,系统使用RT_THREAD V4.0.3,做DHT11温度采集实验时,定义read_temp_thread 线程为高优先级(初始编程线程未让出CPU),led_thread为低优先级,理论来说,read_temp_thread 线程会一直占用CPU,下载到板子之后发现led_thread线程会正常运行。求解答!!!
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018-11-06 SummerGift first version
* 2018-11-19 flybreak add stm32f407-atk-explorer bsp
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <sensor.h>
#include <sensor_dallas_dht11.h>
#define LED0_PIN GET_PIN(F, 9)
#define DHT11_DATA_PIN GET_PIN(G, 9)
#define THREAD_PRIORITY 15
//#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5
ALIGN(RT_ALIGN_SIZE)
static char led_thread_stack[1024];
static struct rt_thread led_thread;
static char read_temp_stack[2048];
static struct rt_thread read_temp_thread;
static void led_thread_entry(void *param)
{
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(500);
rt_kprintf("led_thread running!\n");
}
}
static void read_temp_entry(void *param)
{
rt_device_t dev = RT_NULL;
struct rt_sensor_data sensor_data;
rt_uint8_t get_data_freq = 1; /* 1Hz */
rt_size_t res;
dev = rt_device_find(param);
if(dev == RT_NULL)
{
rt_kprintf("can't find device:%s",param);
return;
}
if(rt_device_open(dev,RT_DEVICE_FLAG_RDWR) != RT_EOK)
{
rt_kprintf("can't open the device:%c",param);
return;
}
rt_device_control(dev,RT_SENSOR_CTRL_SET_ODR,(void *)(&get_data_freq));
while(1)
{
res = rt_device_read(dev,1,&sensor_data,2);
if(res != 1)
{
rt_kprintf("can't read the device:%c\n",param);
return;
}
else
{
if(sensor_data.data.temp >= 0)
{
uint8_t temp = (sensor_data.data.temp&0xffff)>>0;
uint8_t humi = (sensor_data.data.temp&0xffff0000)>>16;
rt_kprintf("temp:%d,humi:%d\n",temp,humi);
}
}
//rt_thread_mdelay(1000);
}
}
int main(void)
{
rt_thread_init(&led_thread,
"thread2",
led_thread_entry,
RT_NULL,
&led_thread_stack[0],
sizeof(led_thread_stack),
THREAD_PRIORITY-1,THREAD_TIMESLICE);
rt_thread_startup(&led_thread);
rt_thread_init(&read_temp_thread,
"read_temp",
read_temp_entry,
"temp_dht11",
&read_temp_stack[0],
sizeof(read_temp_stack),
THREAD_PRIORITY-2,THREAD_TIMESLICE);
rt_thread_startup(&read_temp_thread);
}
static int rt_hw_dht11_port(void)
{
struct rt_sensor_config cfg;
cfg.intf.user_data = (void *)DHT11_DATA_PIN;
rt_hw_dht11_init("dht11", &cfg);
return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_dht11_port);
在main函数中首先你让led_thread线程运行了,它就有机会运行,然后才让read_temp_thread线程运行,因为read_temp_thread的优先级高,所以它一直运行不会出让CPU。