IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> rt-thread学习篇二:$Super$$ 和 $Sub$$ -> 正文阅读

[嵌入式]rt-thread学习篇二:$Super$$ 和 $Sub$$

一、简介

官方说明链接:https://developer.arm.com/documentation/dui0377/g/pge1362065967698

ARM链接器提供$Super$$$Sub$$关键字用来为一些无法修改的函数打补丁。
这是一种特殊模式:用于有一个已经存在且不能被改变的函数的情况(比如不能更改的库函数);使用这两个模式可以帮原函数打补丁,如存在一个函数foo();

$Sub$$foo :定义的新功能函数,在foo()函数之前/后使用$Sub$$foo 可以添加一些新的程序代码。

$Super$$foo :就是原始的未修补的foo函数,使用这个$Super$$foo函数将直接跳转到foo()函数。

二、测试

1、创建一个工程,使用串口发送"$Super$$foo(void)\r\n"字符串。

void foo(void){
  HAL_UART_Transmit(&huart1,(uint8_t*)"-----------------\r\n",19,100);
  HAL_UART_Transmit(&huart1,(uint8_t*)"$Super$$foo(void)\r\n",19,100);
  HAL_UART_Transmit(&huart1,(uint8_t*)"-----------------\r\n",19,100);
}

2、在main函数中调用

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
 
  foo();

  while (1)
  {
  }
}

3、编译、烧录、启动,在串口输出信息如下
在这里插入图片描述
4、在main函数外添加补丁函数,main函数调用foo函数

void $Sub$$foo(void)
{
  HAL_UART_Transmit(&huart1,(uint8_t*)"====================\r\n",22,100);
  HAL_UART_Transmit(&huart1,(uint8_t*)"void $Sub$$foo(void)\r\n",22,100);
  HAL_UART_Transmit(&huart1,(uint8_t*)"====================\r\n",22,100);
}
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
 
  foo();

  while (1)
  {
  }
}

5、串口输入信息如下
在这里插入图片描述
通过以上输出发现,只执行补丁函数,而未执行原来foo函数
6、在补丁函数中调用原来函数,在代码中添加如下信息

extern void $Super$$foo(void);
void $Sub$$foo(void)
{
  HAL_UART_Transmit(&huart1,(uint8_t*)"====================\r\n",22,100);
  HAL_UART_Transmit(&huart1,(uint8_t*)"void $Sub$$foo(void)\r\n",22,100);
  $Super$$foo();
  HAL_UART_Transmit(&huart1,(uint8_t*)"====================\r\n",22,100);
}

7、串口输出信息如下
在这里插入图片描述
通过以上输出信息,可以看出先执行foo补丁函数,再执行foo函数,执行完foo函数后再次执行补丁函数。
8、调整补丁函数执行顺序

extern void $Super$$foo(void);
void $Sub$$foo(void)
{
  HAL_UART_Transmit(&huart1,(uint8_t*)"====================\r\n",22,100);
  HAL_UART_Transmit(&huart1,(uint8_t*)"void $Sub$$foo(void)\r\n",22,100);
  HAL_UART_Transmit(&huart1,(uint8_t*)"====================\r\n",22,100);
  $Super$$foo();
}

9、串口输出信息如下
在这里插入图片描述

三、总结

通过以上分析,可以通过ARM链接器提供$Super$$$Sub$$功能在原有函数前或后插入其他代码,对原有函数打补丁。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:54:30  更:2021-08-16 11:55:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:14:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码