Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
新手学RTT提问:为啥线程不运行?欢迎老师围观
发布于 2019-07-09 08:25:32 浏览:3153
订阅该版
为了检测串口的收发数据,写了下面的代码,奇怪的是串口收发都很正常,但是作为运行指示的LED不会闪烁:L 如果只是运行一个LED线程和随便一个串口的线程,那LED就可以正常闪烁,串口也还是可以工作,是什么原因啊? 本人脸皮厚,不怕高手喷,欢迎围观。:$ ``` /* ************************************************************************* * 包含的头文件 ************************************************************************* */ #include "board.h" #include "rtthread.h" #include
/************************* 全局变量声明 ****************************/ /* 相关宏定义 */ extern char DEBUG_Usart_Rx_Buf[DEBUG_USART_RBUFF_SIZE]; /* ****************************************************************** * 变量 ****************************************************************** */ /* 定义线程控制块 */ static rt_thread_t usart1_rx_thread = RT_NULL; //static rt_thread_t usart2_rx_thread = RT_NULL; //static rt_thread_t usart3_rx_thread = RT_NULL; static rt_thread_t led1_thread = RT_NULL; static rt_thread_t usart3_tx_thread1 = RT_NULL; static rt_thread_t usart3_tx_thread2 = RT_NULL; static rt_thread_t usart3_tx_thread3 = RT_NULL; /* 定义信号量控制块 */ extern rt_sem_t usart1_rx_sem; extern rt_sem_t usart2_rx_sem; extern rt_sem_t usart3_rx_sem; /* ************************************************************************* * 函数声明 ************************************************************************* */ static void usart1_rx_thread_entry(void* parameter); //static void usart2_rx_thread_entry(void* parameter); //static void usart3_rx_thread_entry(void* parameter); static void led1_thread_entry(void* parameter); static void usart3_tx_thread1_entry(void* parameter); static void usart3_tx_thread2_entry(void* parameter); static void usart3_tx_thread3_entry(void* parameter); /* ************************************************************************* * main 函数 ************************************************************************* */ /** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { /* 为USART1接收完成创建一个信号量 */ usart1_rx_sem = rt_sem_create("usart1_rx_sem",/* 消息队列名字 */ 0, /* 信号量初始值,默认有一个信号量 */ RT_IPC_FLAG_FIFO); /* 信号量模式 FIFO(0x00)*/ if (usart1_rx_sem != RT_NULL) rt_kprintf("usart1信号量usart1_rx_sem创建成功!
"); //============================================================================== /* 为USART2接收完成创建一个信号量 */ usart2_rx_sem = rt_sem_create("usart2_rx_sem",0, RT_IPC_FLAG_FIFO); //消息队列名字||信号量初始值,默认有一个信号量||信号量模式 FIFO(0x00) if (usart2_rx_sem != RT_NULL) rt_kprintf("usart2信号量usart2_rx_sem创建成功!
"); //============================================================================ /* 为USART3接收完成创建一个信号量 */ usart3_rx_sem = rt_sem_create("usart3_rx_sem",0, RT_IPC_FLAG_FIFO); if (usart3_rx_sem != RT_NULL) rt_kprintf("usart3信号量usart3_rx_sem创建成功!
"); //================================================================================ usart1_rx_thread = /* 线程控制块指针 */ rt_thread_create( "usart1", /* 线程名字 */ usart1_rx_thread_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ 512, /* 线程栈大小 */ 2, /* 线程的优先级 */ 20); /* 线程时间片 */ /* 启动线程,开启调度 */ if (usart1_rx_thread != RT_NULL) rt_thread_startup(usart1_rx_thread); else return -1; //============================================================================= usart3_tx_thread1 = /* 线程控制块指针 */ rt_thread_create( "usart3_tx_thread1", /* 线程名字 */ usart3_tx_thread1_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ 512, /* 线程栈大小 */ 1, /* 线程的优先级 */ 20); /* 线程时间片 */ /* 启动线程,开启调度 */ if (usart3_tx_thread1 != RT_NULL) rt_thread_startup(usart3_tx_thread1); else return -1; usart3_tx_thread2 = /* 线程控制块指针 */ rt_thread_create( "usart3_tx_thread2", /* 线程名字 */ usart3_tx_thread2_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ 512, /* 线程栈大小 */ 2, /* 线程的优先级 */ 20); /* 线程时间片 */ /* 启动线程,开启调度 */ if (usart3_tx_thread2 != RT_NULL) rt_thread_startup(usart3_tx_thread2); else return -1; usart3_tx_thread3 = /* 线程控制块指针 */ rt_thread_create( "usart3_tx_thread3", /* 线程名字 */ usart3_tx_thread3_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ 512, /* 线程栈大小 */ 1, /* 线程的优先级 */ 20); /* 线程时间片 */ /* 启动线程,开启调度 */ if (usart3_tx_thread3 != RT_NULL) rt_thread_startup(usart3_tx_thread3); else return -1; //================================================================================ led1_thread = /* 线程控制块指针 */ rt_thread_create( "led1", /* 线程名字 */ led1_thread_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ 512, /* 线程栈大小 */ 3, /* 线程的优先级 */ 20); /* 线程时间片 */ /* 启动线程,开启调度 */ if (led1_thread != RT_NULL) rt_thread_startup(led1_thread); else return -1; } /* ************************************************************************* * 线程定义 ************************************************************************* */ static void usart1_rx_thread_entry(void* parameter) { rt_err_t uwRet = RT_EOK; /* 任务都是一个无限循环,不能返回 */ while (1) { uwRet = rt_sem_take(usart1_rx_sem, 0); /* 等待时间:0 */ if(RT_EOK == uwRet) { rt_kprintf("收到数据:%s
", DEBUG_Usart_Rx_Buf); //memset(DEBUG_Usart_Rx_Buf, 0, DEBUG_USART_RBUFF_SIZE); /* 清零 */ } rt_thread_delay(20); } } /* ************************************************************************* * 线程定义 ************************************************************************* */ static void led1_thread_entry(void* parameter) { while (1) { LED1_ON; LED2_ON; rt_thread_delay(500); /* 延时500个tick */ rt_kprintf("led1_thread running,LED1_ON
"); LED1_OFF; LED2_OFF; rt_thread_delay(500); /* 延时500个tick */ rt_kprintf("led1_thread running,LED1_OFF
"); } } /* ************************************************************************* * 线程定义 ************************************************************************* */ static void usart3_tx_thread1_entry(void* parameter) { rt_err_t uwRet = RT_EOK; char *data; uint16_t len; /* 任务都是一个无限循环,不能返回 */ while (1) { uwRet = rt_sem_take(usart3_rx_sem, 0); // 获取串口中断的信号量 , 等待时间:0 if(RT_EOK == uwRet) { data = Uasrt3_ReadDMA_DataLength(&len); //rt_kprintf("收到数据:%s
", data); Usart3_Puts(data); memset(data, 0, WIFI_USART_RBUFF_SIZE); /* 清零 */ } rt_thread_delay(10); } } /* ************************************************************************* * 线程定义 ************************************************************************* */ static void usart3_tx_thread2_entry(void* parameter) { while (1) { Usart3_Puts("串口3定时发送任务,线程2
"); rt_thread_delay(220); } } /* ************************************************************************* * 线程定义 ************************************************************************* */ static void usart3_tx_thread3_entry(void* parameter) { while (1) { Usart3_Puts("串口3定时发送任务线程3
"); rt_thread_delay(330); } } /********************************END OF FILE****************************/ ```
查看更多
15
个回答
默认排序
按发布时间排序
tyustli
2019-07-09
这家伙很懒,什么也没写!
线程都运行的时候控制台也不可以使用吗?那应该是程序死机了,可以看一下是不是内存不够
还没想好
2019-07-09
这家伙很懒,什么也没写!
把线程栈开大点试试
lf8013
2019-07-09
这家伙很懒,什么也没写!
>线程都运行的时候控制台也不可以使用吗?那应该是程序死机了,可以看一下是不是内存不够 ... --- 没有使用控制台,用的STM32F103C8T6,内存不大,能省的都省了。程序没有死机,我随机发送数据到串口3,都可以返回接收的数据,就是LED不闪烁,不知道为啥
lf8013
2019-07-09
这家伙很懒,什么也没写!
>把线程栈开大点试试 --- 现在板子不再身边,晚上回去加大线程栈试试
lf8013
2019-07-09
这家伙很懒,什么也没写!
是不是有那个地方定义了限制最大线程的数量,我发现只要线程数超过4个,第5个线程就不会执行,只是前面声明的4个线程可以正常工作
lf8013
2019-07-10
这家伙很懒,什么也没写!
顶起来,顺便然后补充一下,代码使用的是野火指南者开发板的,rtt系统版本是3.0.3。那位老师能指点一下出现这个问题可能的原因吗?谢谢了!
还没想好
2019-07-10
这家伙很懒,什么也没写!
单步看看,是不是每个线程都创建成功了?
Ernest
2019-07-10
这家伙很懒,什么也没写!
led 引脚有初始化?
水清沙白
2019-07-10
这家伙很懒,什么也没写!
F103C8T6,很大概率会栈不够,把创建线程的结果打印一下,看最后的led线程是否成功创建了
lf8013
2019-07-10
这家伙很懒,什么也没写!
谢谢了,晚点再测试一下。 LED是正常的,我不是说了吗,只要是4个线程就可以正常工作,如果开5个线程,那么最后一个线程就不运行了,但是前面4个线程还是能正常运行的。 感觉F103C8T6没法上RTT系统,裸跑一个系统都没有多少资源剩下了
撰写答案
登录
注册新账号
关注者
0
被浏览
3.2k
关于作者
lf8013
这家伙很懒,什么也没写!
提问
4
回答
16
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部