S32K 全局标志位没有使用volatile导致程序卡死问题

OSIF添加

默认在Reference_Components下面有, 没有的话也可以从Componets Library里面拉过来:

在这里插入图片描述

然后可以直接使用 OSIF_TimeDelay(100); 延时100ms.

printf支持

串口的printf支持可以参考我之前的博客 :

或者使用不限特定单片机和IDE, 嵌入式系统更为通用的自己组printf:

可以看看这一篇:

如果想要在中断中使用, 不能使用blocking的方式, 改为LPUART_DRV_SendDataPolling:

void _putchar(char character)
{
    LPUART_DRV_SendDataPolling(INST_LPUART2, (uint8_t *)&character, 1);
}

进入本篇重点

typedef struct
{
    uint8_t s1;
} TIMER_FLAG;

TIMER_FLAG timer_flags;

void lpit_callback(void)
{   //10ms
    static uint64_t cnt = 0;
    LPIT_DRV_ClearInterruptFlagTimerChannels(INST_LPIT1, (1 << LPIT_CHANNEL));

    if(cnt % 100 == 0) {
        timer_flags.s1 = 1;
    }

    ++cnt;  
}

int main(void)
{
    static uint64_t main_cnt = 0;

    ...

    while(1)
    {
        //OSIF_TimeDelay(100);

        if(timer_flags.s1 == 1) {
            timer_flags.s1 = 0;
            printf("main_cnt = %lld\n", ++main_cnt);
        }
    }
}

然后串口直接卡死, 发不出来数据, while中把OSIF_TimeDelay(100);的注释打开, 是可以发出来的.

最后找了半天, 原来是这个标志位应该声明为volatile uint8_t s1;, 其实中断和其他函数中来回倒的标志位基本都要声明成volatile, 不然赋值来不及生效, 像上面代码中, timer_flags.s1 = 0; 并没有来得及生效, 导致短时间发了大量printf, 串口一下子涌进来N多数据, 直接就卡死了.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值