找回密码
 立即注册
查看: 67|回复: 3

AI8051U的printf_usb函数异常导致main主循环阻塞

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-04-24 21:26:47

4

主题

3

回帖

36

积分

新手上路

积分
36
发表于 2026-4-12 19:27:05 | 显示全部楼层 |阅读模式
在多个地方调用printf_usb函数,可能会导致程序阻塞问题。
在测试例程中,同时在main主循环和定时器中调用printf_usb,使用usb口连接到电脑。
当STC-ISP打开对应的COM口时,可以观察到main主循环和定时中断函数中调用的printf_usb正常输出,同时相应的p2.0和p2.1指示灯正常闪烁。
当STC-ISP关闭对应的COM口后,定时器对应的P2.1指示灯正常闪烁,而主循环对应的P2.0指示灯闪烁几次后,就不再闪烁了。
===================================================================
测试例程 printf_usb错误测试.rar (109.99 KB, 下载次数: 2) 是使用AiClue助手生成的32位程序项目,主要配置如下:
无标题.png
生成的程序中仅做如下修改:
1.修改定时器初始化程序:(带**的行)

void TIMER0_Init(void)
{
    。。。
    TIMER0_SetIntPriority(0);           //设置中断为最低优先级   
    //TIMER0_EnableInt();               //使能定时器0中断  //*****在这里使能,定时器不工作
    TIMER0_SetPrescale(T0_PSCR);        //设置定时器0的8位预分频
    TIMER0_SetReload16(T0_RELOAD);      //设置定时器0的16位重载值
    TIMER0_Run();                       //定时器0开始运行
    TIMER0_EnableInt();                 //使能定时器0中断  //****将这句移到这里,定时器才能正常工作   
}


2.main函数主循环:

u8 main_loop_cnt=0;   //主循环次数
u8 timer_call_cnt=0;    //定时器次数
void main(void)


{    。。。
    while (1)
    {
        main_loop_cnt++;
        P20=~P20;               //用于观察主循环运行状态
        P0=~main_loop_cnt;
        printf_usb("main_loop_cnt=%d,  timer_call_cnt=%d\n",main_loop_cnt,timer_call_cnt);
        delay_ms(500);                        
    }
。。。
}


3.定时器中断函数:

void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
    //<<AICUBE_USER_TIMER0_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码  
                        timer_call_cnt++;
                        P21=~P21;   //用于观察定时器运行状态
                        printf_usb("main_loop_cnt=%d,  timer_call_cnt=%d\n",main_loop_cnt,timer_call_cnt);        
    //<<AICUBE_USER_TIMER0_ISR_CODE1_END>>        
}



回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2026-04-30 08:53:57
已绑定手机

106

主题

4345

回帖

9748

积分

荣誉版主

无情的代码机器

积分
9748
发表于 2026-4-12 21:45:26 | 显示全部楼层
不要在中断里打印,设置flag集中在main里打印
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:107
  • 最近打卡:2026-04-30 14:22:38
已绑定手机

4

主题

272

回帖

6183

积分

论坛元老

积分
6183
发表于 2026-4-13 09:40:17 | 显示全部楼层
printf_usb底层实现代码似乎是在库里面对吧,所以我也不好说。
但是,假如你是使用串口发送数据,如果主循环与中断都同时调用串口发送函数,且依靠TI标志来判断发送完成,那么就有可能一方清除了TI标志导致另一方等不到这个标志而陷入死循环。
建议按楼上的方法来。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-04-24 21:26:47

4

主题

3

回帖

36

积分

新手上路

积分
36
发表于 2026-4-13 13:31:37 | 显示全部楼层
上面这个是测试程序,无意中发现在多个地方调用pringf_usb这个函数可能会导致程序阻塞。
封装库里可能没有将USB接口当做独占设备处理,也可能缺少超时处理,使调用pringf_usb函数时有可能进入死循环。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 12:08 , Processed in 0.111206 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表