完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
当使用多线程我设置优先级的话设置三个,他只会跑2个或者1个,但是设置成分之间同优先级就可以。请问大佬们啥原因啊。
我写的程序线程的函数 static int Thread_adc(void) { rt_thread_t thread_adc = RT_NULL; thread_adc = rt_thread_create( "adc",//线程名字 adc_thread_entry,//线程入口函数 RT_NULL,//线程入口函数参数 512,//分配堆栈大小 RT_THREAD_PRIORITY_MAX / 2,//线程的优先级 5);//线程所分配的时间片 if(thread_adc != RT_NULL) { rt_thread_startup(thread_adc); //启动线程 } } static int Thread_KEY(void) { rt_thread_t thread_key= RT_NULL; thread_key = rt_thread_create( "key",//线程名字 key_thread_entry,//线程入口函数 RT_NULL,//线程入口函数参数 512,//分配堆栈大小 RT_THREAD_PRIORITY_MAX / 2,//线程的优先级 2);//线程所分配的时间片 if(thread_key == RT_NULL) { rt_kprintf("Thread_key ERROR"); return RT_ERROR; } rt_thread_startup(thread_key); //启动线程 } 这是我代码线程编写的格式 #define ADC_DEV_NAME "adc0" /* ADC 设备名称 */ #define ADC_DEV_CHANNEL 9 /* ADC 通道 */ #define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以 100 保留 2 位小数*/ #define CONVERT_BITS 1024 /* 转换位数为 10 位 */ void adc_init() { // adc = rt_pin_get("PE.7"); // rt_pin_mode(adc, PIN_MODE_INPUT); // rt_adc_device_t adc_dev; rt_err_t ret = RT_EOK; /* 查找设备 */ adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); if (adc_dev == RT_NULL) { rt_kprintf("adc sample run failed! can't find %s device!n", ADC_DEV_NAME); // return RT_ERROR; } /* 使能设备 */ ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL); } void adc_read() { uint32_t value, vol,v; /* 读取采样值 */ buffad[0] = rt_adc_read(adc_dev, ADC_DEV_CHANNEL); rt_kprintf("the value is :%d n", value); /* 转换为对应电压值 */ value = buffad[0]; value = value + buffad[0]; value = value + buffad[0]; value = value + buffad[0]; value = value / 4; vol = value * REFER_VOLTAGE / CONVERT_BITS; buffad[1]= vol*2; buffad[2]=((buffad[1]-275)/145)*100; v = buffad[2]; rt_kprintf("the voltage is :%d.%02d n",v / 100 ,v % 100); } static void adc_thread_entry(void* p) { adc_init(); while(1) { rt_kprintf("Thread_ADC"); adc_read(); rt_thread_mdelay(5000); } } uint8_t key1,key2,key3,key_onoff; uint8_t flag=0; void key_init() { key1 = rt_pin_get("PF.1"); key2 = rt_pin_get("PF.0"); key3 = rt_pin_get("PA.2"); key_onoff = rt_pin_get("PE.6"); rt_pin_mode(key1, PIN_MODE_INPUT); rt_pin_mode(key2, PIN_MODE_INPUT); rt_pin_mode(key3, PIN_MODE_INPUT); rt_pin_mode(key_onoff, PIN_MODE_INPUT); rt_pin_write(key1, PIN_LOW); rt_pin_write(key2, PIN_LOW); rt_pin_write(key3, PIN_LOW); } static void key_thread_entry(void* p) { key_init(); flag=0; while(1) { if (rt_pin_read(key1)==0) { rt_thread_mdelay(100); if (rt_pin_read(key1)==0) { flag=1; } } if (rt_pin_read(key3)==0) { rt_thread_mdelay(100); if (rt_pin_read(key3)==0) { flag=3; } } } } |
|
相关推荐
6个回答
|
|
抢占式调度,高优先级的线程会一直运行,高优先级的线程不主动挂起的话是调度不到低优先级的任务的。
|
|
|
|
你的两个线程的while循环中有没有加延时函数?如果高优先级的线程一直占用CPU,那低优先级线程就无法执行了。另外时间片可以稍微大一些。
|
|
|
|
但是调度的话,为啥时间轮询就没事呢
|
|
|
|
优先级不同是抢占,优先级相同是轮询
|
|
|
|
每个线程的时间片要设置长一点,例如50;每个线程内要有延时函数,好让低优先级的线程有机会运行。
|
|
|
|
我试过了不行,就是我优先级设置的不一样没办法运行时间我设置过变大了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
973 浏览 0 评论
IaaS+on+DPU(IoD)+下一代高性能算力底座技术白皮书
1917 浏览 0 评论
飞凌嵌入式-ELFBOARD 常用的USB接口及其不同版本介绍第1期
1062 浏览 0 评论
【Vision Board创客营连载体验】RA8D1-Vision Board上OSPI-Flash实践
1517 浏览 0 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 应用层更改引脚复用的方法
3744 浏览 0 评论
65043 浏览 21 评论
嵌入式热门DIY项目:智能机器人开源资料合集(原理图、代码、论文)
67709 浏览 22 评论
57714 浏览 32 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 11:25 , Processed in 0.872865 second(s), Total 79, Slave 63 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号