RT-Thread论坛
直播中

李微波

7年用户 926经验值
私信 关注

在STM32F407上移植RTThread后,创建一个线程成功,通过打印发现该线程只执行一次,为什么?

th_uart2 = rt_thread_create("uart2_rec" , Serial2Th_entry , RT_NULL , 512 ,10 , 100);
    if(RT_NULL != th_uart2)
    {
        rt_thread_startup(th_uart2);
    }
void Serial2Th_entry(void * parameter)
{
static char uart2rx_buffer;
    while(1)
    {
        LOG_D("jion Serial2Th_entry\r\n");
        while(rt_device_read(serial_u2 , 0 , &uart2rx_buffer , 1) != 1)
        {
            rt_sem_take(&uart2rx_sem , RT_WAITING_FOREVER);
            LOG_D("%c\r\n" , uart2rx_buffer);
        }
        rt_device_write(serial_u2,0,&uart2rx_buffer,sizeof(uart2rx_buffer));
    }
}

回帖(1)

Arvinhw

2024-7-25 17:25:45
在STM32F407上移植RTThread后,创建一个线程成功,但发现该线程只执行一次。根据您提供的代码,我们可以逐步分析可能的原因:

1. 首先,检查线程创建是否成功:
   ```
   th_uart2 = rt_thread_create("uart2_rec", Serial2Th_entry, RT_NULL, 512, 10, 100);
   if(RT_NULL != th_uart2)
   {
       rt_thread_startup(th_uart2);
   }
   ```
   这里创建了一个名为"uart2_rec"的线程,入口函数为Serial2Th_entry,优先级为10。如果线程创建成功,会调用rt_thread_startup启动线程。

2. 检查线程入口函数Serial2Th_entry:
   ```
   void Serial2Th_entry(void * parameter)
   {
       static char uart2rx_buffer;
       while(1)
       {
           LOG_D("join Serial2Th_entryrn");
       }
   }
   ```
   在这个函数中,使用了无限循环(while(1)),并且每次循环都会打印一条日志。从代码上看,这个函数应该能够持续运行。

3. 可能的原因:
   - 线程优先级问题:如果其他线程的优先级高于该线程,可能会导致该线程无法获得CPU时间片,从而无法执行。可以尝试调整线程优先级。
   - 调度器问题:如果调度器出现问题,可能会导致线程无法正常调度。可以尝试重启RTThread或者检查调度器的配置。
   - 硬件问题:如果STM32F407硬件存在问题,可能会影响线程的执行。可以检查硬件连接和配置。

4. 解决方案:
   - 检查线程优先级,确保该线程能够获得足够的CPU时间片。
   - 检查RTThread的调度器配置,确保调度器正常工作。
   - 检查STM32F407硬件连接和配置,确保硬件没有问题。

通过以上分析,您可以逐步排查问题,找到导致线程只执行一次的原因,并采取相应的解决方案。
举报

更多回帖

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