MDK ARM中weak关键字的使用与中断服务函数

本文介绍了在MDKARM环境下,由于使用weak关键字定义中断服务函数导致串口1中断无法正常工作的问题。问题表现为中断服务函数未被编译,从而无法进入中断。原因在于__weak或weak属性使得编译器优先链接非weak版本的函数。解决方案是显式定义中断服务函数,使用与启动文件中相同的名称进行覆写。博客还提及了使用FreeRTOS的串口接收中断及队列处理数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MDK ARM中weak关键字的使用与中断服务函数

问题现象

#define DEMO_LPUART_IRQHandler LPUART1_IRQHandler

对于RT1052中断服务函数,发现串口1中断服务没有编译,中断也无法进入。

void DEBUG_UART_IRQHandler(void)
{
	BaseType_t xHigherPriorityTaskWoken;
	   xHigherPriorityTaskWoken = pdFALSE;

  uint8_t ucTemp;
  /*串口接收到数据*/
  if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(DEMO_LPUART))
  {
    /*读取数据*/
    ucTemp = LPUART_ReadByte(DEMO_LPUART);
    queue_push(ucTemp);
     /*将读取到的数据发送出去*/
	//xQueueSendFromISR(xQueueUart, (void*)&ucTemp, &xHigherPriorityTaskWoken);
	//portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  }
}

问题原因

__weak 或 [weak] 具有相同的功能,用于定义变量或者函数,常见于定义函数,在 MDK 链接时优先链接定义为非 weak 的函数或变量,如果找不到则再链接 weak 函数。

在这里插入图片描述

解决方法之一

显示定义串口中断服务函数,直接把startup_MIMXRT1052.s启动文件中的中断服务函数定义名称复制过来,重新定义,相对于C++的重载模式(覆写);
在这里插入图片描述
参考链接:
博文提供这样一种方法:FreeRTOS中串口接收数据中断,然后通过队列将数据传递给任务A,在任务A中对数据进行处理,串口使用的通讯协议为自定义。
https://blog.youkuaiyun.com/weixin_43499780/article/details/106392129

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值