嵌入式技术论坛
直播中

nhcp

15年用户 1135经验值
私信 关注
[问答]

多次调用rt_thread_startup出现stack overflow错误怎么解决?

目的:想要实现串口接收不定长数据,思路如下:一个串口接收线程,一个判断数据是否接收完成线程。
串口接收线程中:接收一个字节,令开始接收标志(rx_start=1)置1,同时将(rx_count=0),开启计时线程rt_thread_startup(timeout_thread)。
是否接收完成线程中:对rx_count++,如果rx_count到达某个值,说明串口接收完成,对数据进行处理同时将标志清零。
具体代码如下:



void serial_thread_entry(void *parameter)
{
char buffer;
while(1)
{
while(rt_device_read(u1_dev, 0, &buffer, 1) != 1)//从串口读一个字节数据,没有读到则等待接收信号量
{
rt_sem_take(&uart1_rx_sem, RT_WAITING_FOREVER);//阻塞等待接收信号量,等待到信号量后再次读取数据
}
temp_cmd[temp_len++] = buffer; //接受缓存中的数据

//计数归0,每次接收到一个数据都将该值置0,从而可以重新进行计时
rx_count = 0;
if(rx_start == 0)
{
rt_thread_startup(timeout_thread);
}
rx_start = 1;
}

void timeout_thread_entry(void *parameter)
{
int i;
if(rx_start == 1)
{
while(rx_count < 2)
{
rx_count ++;
rt_thread_delay(1);
}
if (rx_count >= 2)
{

rx_count = 0;
//处理收到的数据
rt_memset(temp_cmd, 0, temp_len);
temp_len = 0;
rx_start = 0;
}
}
}

rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
{
rt_sem_release(&uart1_rx_sem);//串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量
return RT_EOK;
}

int main(void)
{
rt_kprintf("========================打开串口,并创建串口线程===============================n");
rt_err_t ret = 0;
u1_dev = rt_device_find("uart1");
if(u1_dev == RT_NULL)
{
rt_kprintf("rt_device_find uart1 failedn");
return -EINVAL;
}

ret = rt_device_open(u1_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); //以读写及中断接收方式打开串口设备
if(ret < 0)
{
rt_kprintf("rt_device_open uart failedn");
return ret;
}

rt_device_set_rx_indicate(u1_dev, rx_callback); //设置接收回调函数

ret = rt_sem_init(&uart1_rx_sem, "u1_sem", 0, RT_IPC_FLAG_FIFO); //先进先出
if(ret != RT_EOK)
{
rt_kprintf("rt_sem_init failed...n");
return ret;
}

rt_thread_t u1_thread = rt_thread_create("u1_recv", serial_thread_entry, RT_NULL, 1024*8, 17, 5);
if(u1_thread == RT_NULL)
{
return RT_ERROR;
}
rt_thread_startup(u1_thread);

timeout_thread = rt_thread_create("timeout", timeout_thread_entry, RT_NULL, 1024, 18, 5);
if(timeout_thread == RT_NULL)
{
return RT_ERROR;
}

return 0;
}


出现的问题是:用串口助手发送第一包数据时可以正常处理,再发送一包数据(即便是1个字节),出现thread: stack overflow,定位到再第二次开启判断接收是否完成线程rt_thread_startup(timeout_thread)卡住了,各位大佬看看这个是什么造成的呢?

回帖(2)

h1654155272.9717

2022-6-8 10:20:18
temp_cmd[temp_len++] = buffer;     //接受缓存中的数据
加个越界保护吧
举报

chumowei

2022-6-8 10:21:01
用一个定时器线程定时判断数据是否接收完?这个操作。。。
为啥不试试 serialX 呢,可以达到你的需求。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分