RT-Thread论坛
直播中

申换换

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

线程创建成功了,为啥ai_thread_entry()函数不运行呢?

我这个线程创建成功了,为啥ai_thread_entry()函数不运行呢?

void airun_thread()
{
    /* 创建 serial 线程 */
    rt_thread_t thread = rt_thread_create("ai", ai_thread_entry, RT_NULL, 1024, 28, 30);
    /* 创建成功则启动线程 */
    if (thread != RT_NULL)
    {
        rt_pin_write(LED2,PIN_LOW);
        rt_thread_startup(thread);
    }
}
void ai_thread_entry(void *param)
{
    while(1)
    {
        PT1=getaibyChanel(ADC_DEV_NAME0,0);
        PT2=getaibyChanel(ADC_DEV_NAME0,1);
        PT3=getaibyChanel(ADC_DEV_NAME0,2);
        PT4=getaibyChanel(ADC_DEV_NAME0,3);
        //临时方案,关闭AD通道,设置为普通输入通道
        rt_pin_mode(GET_PIN(A, 0), PIN_MODE_INPUT);
        rt_pin_mode(GET_PIN(A, 1), PIN_MODE_INPUT);
        rt_pin_mode(GET_PIN(A, 2), PIN_MODE_INPUT);
        rt_pin_mode(GET_PIN(A, 3), PIN_MODE_INPUT);
        AI1=getaibyChanel(ADC_DEV_NAME1,4);
        AI2=getaibyChanel(ADC_DEV_NAME1,5);
        AI3=getaibyChanel(ADC_DEV_NAME1,6);
        //AI4=getaibyChanel(ADC_DEV_NAME0,7);
        PT1old=getPToldValue(PT1);//2.8432875
        PT2old=getPToldValue(PT2);
        PT3old=getPToldValue(PT3);
        PT4old=getPToldValue(PT4);
        rt_uint16_t u1=0.254767386299465*PT1old-55.8156683028539;
        rt_uint16_t u2=0.254767386299465*PT2old-55.8156683028539;
        AI1old=AI1/4;
        AI2old=AI2/4;
        AI3old=AI3/4;
        rt_pin_write(LED3,PIN_LOW);
        rt_thread_mdelay(500);
    }
}
下载调试的时候现象是LED2正常亮 LED3不会亮,调试的时候不管断点在void ai_thread_entry(void *param)函数的任意位置 都执行不到,求大佬们解答

回帖(1)

人走了

2024-9-29 16:41:13
在分析这个问题之前,我们需要先了解一下线程创建和启动的基本概念。

1. **线程创建**:在创建线程时,我们需要指定线程的名称、入口函数、参数、堆栈大小、优先级和时间片。在你的代码中,你已经成功创建了一个线程。

2. **线程启动**:创建线程后,我们需要调用 `rt_thread_startup()` 函数来启动线程。在你的代码中,你也成功启动了线程。

现在,我们来分析一下为什么 `ai_thread_entry()` 函数没有运行:

1. **入口函数问题**:首先,我们需要确保 `ai_thread_entry()` 函数是正确的。检查函数的定义和实现,确保没有语法错误或逻辑错误。

2. **线程优先级**:检查线程的优先级是否正确。在你的代码中,线程的优先级是28,这是一个相对较高的优先级。如果系统中有其他具有更高优先级的线程正在运行,那么 `ai_thread_entry()` 函数可能无法获得执行机会。

3. **线程调度**:检查系统的线程调度策略。如果调度策略有问题,可能导致 `ai_thread_entry()` 函数无法正常运行。

4. **线程挂起**:检查是否有其他代码将这个线程挂起。如果线程被挂起,那么它将无法运行。

5. **线程堆栈溢出**:检查线程的堆栈是否足够大。如果堆栈太小,可能导致堆栈溢出,从而影响线程的运行。

6. **硬件问题**:检查硬件环境是否支持多线程。如果硬件不支持多线程,那么线程可能无法正常运行。

7. **调试工具**:使用调试工具(如 GDB)来跟踪线程的执行。这可以帮助你找到问题的根源。

综上所述,要解决这个问题,你需要从多个方面进行排查。首先检查 `ai_thread_entry()` 函数本身,然后检查线程的优先级、调度策略、挂起状态、堆栈大小和硬件环境。如果问题仍然存在,可以尝试使用调试工具来跟踪线程的执行。
举报

更多回帖

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