爱编程的斯蒂芬 2026-03-05 18:27 采纳率: 33.3%
浏览 11

问题:安信可科技WB2系列aipi-palchatv1官方代码烧录后模组无反应,但注释掉无关代码能点亮LED

问题描述
我使用make编译了基于Ubuntu 20.04 的 Linux 子系统环境下安信可科技 WB2系列(基于BL602芯片): aipi-palchatv1 源码,烧录自己生成的散装固件后,模组完全没反应(不说话、LED 不亮)。但当我把 main.c 中与点灯无关的代码全部注释掉,只保留最基本的 GPIO 初始化和 LED 任务时,LED 能正常闪烁,证明编译和烧录本身是成功的。
源代码我是按照这个命令执行下载的 git clone https://gitee.com/Ai-Thinker-Open/aipi-palchatv1.git

注意:烧录了完整镜像固件AiPi-PalChatV1_uart-mcp_WWXH_v3.0_20260106.bin后模组可以正常说话,我没有改过的源代码烧录后模组也没反应
关键代码(简化版,能亮灯):

void led_task(void *pvParameters) {
    bl_gpio_enable_output(SPK_GPIO_LED,0,0);
    uint8_t led_status = 0;
    while(1) {
        bl_gpio_output_set(SPK_GPIO_LED, led_status);
        led_status = !led_status;
        vTaskDelay(300);
    }
}

void main() {
    bl_sys_init();
    bl_gpio_enable_output(SPK_GPIO_LED,0,0);
    xTaskCreate(led_task, "led_task", 1024, NULL, 15, NULL);
    // 没有其他初始化,LED 正常闪烁
}

源工程代码main.c部分+点灯代码:

void led_task(void *pvParameters)
{
    bl_gpio_enable_output(SPK_GPIO_LED,0,0);
    uint8_t led_status = 0;
    while (1)
    {
        bl_gpio_output_set(SPK_GPIO_LED, led_status);
        printf("[%s()-%d]led_status:%d\r\n", __func__, __LINE__, led_status);
        led_status = !led_status;
        vTaskDelay(300);
    }
}

void main()
{
    bl_sys_init();
    // printf("************************fw_version:%s*********************************\r\n",fw_version);
    // printf("************************compile time:%s %s*********************************\r\n",__DATE__,__TIME__);
    easyflash_init();
    ef_get_u8(_printf_key, &printf_enble);
    ef_get_u32(uart_baudrate_key, &uart_baudrate);
    ef_get_u8(config_led_key, &config_led);

    if (uart_baudrate != 0)
    {

        bl_uart_setbaud(0, uart_baudrate);
    }
    else
    {
        // bl_uart_init(0, 12, 11, 0, 0, 115200);
        bl_uart_setbaud(0, 115200);
    }

    activeInfo.server = WEB_SERVER;
    activeInfo.portStr = WEB_PORT;
    activeInfo.url = DEFAULT_WS_URL;
    activeInfo.ws_url = WEB_URL;
    xiaozhi_init(&activeInfo);
    print_boot_info();
    extern int xiaozhi_bl602_cli_init(void);
    xiaozhi_bl602_cli_init();
    extern int customize_at_cli_init(void);
    customize_at_cli_init();

    get_xiaozhi_info();
    // 客制化ota配置,需要根据实际情况修改,如果不设置则使用安信可默认配置
    //  wifi_g_customize_ota_cfg=malloc(sizeof(customize_ota_cfg_t));
    //  wifi_g_customize_ota_cfg->host="aithinker.oss-cn-beijing.aliyuncs.com";
    //  wifi_g_customize_ota_cfg->port=80;
    //  wifi_g_customize_ota_cfg->resource="/wifi_ota.bin";
    //  vb6824_g_customize_ota_cfg=malloc(sizeof(customize_ota_cfg_t));
    //  vb6824_g_customize_ota_cfg->host="aithinker.oss-cn-beijing.aliyuncs.com";
    //  vb6824_g_customize_ota_cfg->port=80;
    //  vb6824_g_customize_ota_cfg->resource="/vb6824_ota.bin";
    bl_gpio_enable_output(SPK_GPIO_LED,0,0);

    xTaskCreate(uart_ota_task, (char *)"uart_ota_task", 1024, vb6824_g_customize_ota_cfg, 15, &vb6824_module_ota_task_handle);
    xTaskCreate(proc_main_entry, (char *)"main_entry", 1024 * 2 + 512, NULL, 15, NULL);
    xTaskCreate(http_ota_task, (char *)"http_ota_task", 1024, wifi_g_customize_ota_cfg, 15, &wifi_module_ota_task_handle);
    xTaskCreate(led_task, (char *)"led_task", 1024, NULL, 15, NULL);
    // xTaskCreate(free_heap_size_task, (char *)"free_heap_size_task", 256, &fw_version, 3, NULL);
    puts("[OS] Starting TCP/IP Stack...\r\n");
    tcpip_init(NULL, NULL);
 
    // free(wifi_g_customize_ota_cfg);
    // free(vb6824_g_customize_ota_cfg);
    key_scan();
   


}


  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-03-05 18:28
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你描述的问题是:在烧录 aipi-palchatv1 源码后,模组无反应(不说话、LED 不亮),但注释掉无关代码后 LED 能正常闪烁。这表明 编译和烧录过程没有问题,但 某些初始化或任务逻辑导致了系统无法正常运行


    ✅ 问题分析

    根据你的描述和提供的代码片段,可以总结出以下几点:

    1. GPIO 初始化正确

    • bl_gpio_enable_output(SPK_GPIO_LED,0,0); 是正确的 GPIO 配置。
    • 在简化版本中,LED 能正常闪烁,说明 硬件部分没有问题

    2. 主函数中存在多个任务创建

    • xTaskCreate(...) 创建了多个任务,包括:
      • uart_ota_task
      • proc_main_entry
      • http_ota_task
      • led_task
    • 这些任务的执行可能相互干扰,尤其是资源占用较多的任务。

    3. 可能存在资源竞争或死锁

    • 如果这些任务中涉及 互斥锁、信号量、内存分配等资源管理,而没有合理处理,可能导致任务无法启动或阻塞。

    4. printf 和日志输出影响系统行为

    • 你提到在简化版中使用了 printf(),但在完整版中注释掉了。
    • 但如果你在其他地方仍然有 printf() 或日志输出,可能会导致 系统卡顿或崩溃,尤其是在 低内存环境 下。

    🔧 解决方案

    ✅ 一、逐步排查问题

    1. 确保所有任务都正确创建并运行

      • 检查每个 xTaskCreate() 是否成功。
      • 使用 vTaskList() 查看任务状态。
    2. 检查任务优先级和资源分配

      • 所有任务的优先级为 15,可能过高,导致抢占式调度问题。
      • 建议将任务优先级设置为合理的值(如 1015 之间)。
    3. 检查是否有死锁或资源竞争

      • 如果任务间使用了 semaphoremutex,请确认是否被正确释放。
      • 可以通过 vTaskGetApplicationState() 来查看任务状态。
    4. 禁用日志输出

      • 如果你在其他地方有 printf()puts(),尝试暂时关闭它们,观察系统是否恢复正常。
    5. 检查堆栈大小

      • 有些任务可能需要更大的堆栈空间(如 proc_main_entry),当前设置为 1024,可能不够。
      • 可以尝试增加堆栈大小,例如:
        xTaskCreate(proc_main_entry, (char *)"main_entry", 2048, NULL, 15, NULL);
        
    6. 添加调试信息

      • main() 函数中添加一些打印语句,确认程序是否运行到某一步就卡住。
      • 例如:
        printf("Starting main function...\r\n");
        bl_sys_init();
        printf("System initialized.\r\n");
        easyflash_init();
        ...
        

    ✅ 二、优化后的示例代码(修改建议)

    void led_task(void *pvParameters)
    {
        bl_gpio_enable_output(SPK_GPIO_LED, 0, 0);
        uint8_t led_status = 0;
        while (1)
        {
            bl_gpio_output_set(SPK_GPIO_LED, led_status);
            printf("[%s()-%d]led_status:%d\r\n", __func__, __LINE__, led_status);
            led_status = !led_status;
            vTaskDelay(300);
        }
    }
    
    void main()
    {
        // 添加调试打印
        printf("Starting system initialization...\r\n");
    
        bl_sys_init();
    
        // 禁用日志输出
        // easyflash_init();
        // ef_get_u8(_printf_key, &printf_enble);
    
        // UART 初始化(可选)
        // bl_uart_setbaud(0, 115200);
    
        // 仅保留必要的任务
        xTaskCreate(led_task, "led_task", 1024, NULL, 15, NULL);
    
        // 启动 TCP/IP 协议栈
        puts("[OS] Starting TCP/IP Stack...\r\n");
        tcpip_init(NULL, NULL);
    
        // 保持空循环
        while (1) {
            vTaskDelay(1000);
        }
    }
    

    🛠️ 三、进一步排查建议

    | 问题类型 | 建议 | |---------|------| | 任务无法启动 | 检查 xTaskCreate() 是否返回 pdTRUE,并确认任务函数未被中断。 | | 系统卡死 | 使用 vTaskList() 查看任务状态,确认是否所有任务都在运行。 | | 资源不足 | 增加任务堆栈大小,避免内存溢出。 | | 日志输出问题 | 禁用 printf()puts(),观察是否恢复功能。 |


    🧪 四、测试步骤建议

    1. 最小化测试:只保留 led_tasktcpip_init(),其余代码全部注释。
    2. 逐步添加功能:每次添加一个任务或模块,观察是否再次出现无反应。
    3. 使用调试器:连接 JTAG 或 SWD 接口,查看程序是否卡在某个函数中。
    4. 查看日志输出:如果支持串口调试,查看是否有错误提示或异常信息。

    ✅ 总结

    | 问题原因 | 解决方案 | |---------|----------| | 多任务冲突或资源竞争 | 降低任务优先级,优化任务结构 | | 日志输出影响系统 | 禁用或减少 printf() 输出 | | 堆栈不足 | 增加任务堆栈大小 | | 任务未启动 | 检查 xTaskCreate() 返回值和任务函数逻辑 |


    如果你能提供完整的 main.c 文件或更详细的错误日志,我可以进一步帮你定位问题。希望以上建议对你有所帮助!

    评论

报告相同问题?

问题事件

  • 修改了问题 3月6日
  • 修改了问题 3月6日
  • 修改了问题 3月6日
  • 修改了问题 3月6日
  • 展开全部