MDK平台 - 变量和函数定义绝对位置


【全文大纲】 : https://blog.youkuaiyun.com/Engineer_LU/article/details/135149485


1 . 前言

有时候需要在MDK中把变量或函数定义到绝对位置,以下简述做法


2 . 变量定义到绝对位置

uint8_t ram attribute((section(“.ARM.__at_0x20000000”))) = 0x00;

3 . 函数定义到绝对位置

方式一:
void func(void) __attribute((section(“.ARM.__at_0x8020000”)));

方式二:
#pragma arm section code=“.ARM.__at_0x8020000”
void func(void)
{
}

4 . 总结

以上方式都不需要修改分散加载文件,方便快速实现

技术交流群 : 745662457
群内专注 - 问题答疑,技术研究

在Keil中遇到变量函数同名导致无法区分的问题,可以考虑以下几种解决办法: 1. **规范命名**:避免使用相同的名称来定义变量函数,采用具有描述性的命名规则,使名称能够清晰反映其用途功能,减少混淆的可能性。例如,若有一个用于计算平均值的函数,可命名为`calculateAverage`,而存储平均值的变量可命名为`averageValue`。 2. **检查编译器设置**:Keil 4编译代码时不区分大小写,这可能会增加同名冲突的概率。可以检查编译器设置,查看是否有相关选项能够增强大小写敏感性或进行更严格的语法检查。 3. **利用IDE功能**:若使用的是Keil 5,其在高亮显示相同名字的变量以及将`#if #else #endif`中不参与编译的代码灰色显示方面表现更好,可利用这些功能来辅助区分变量函数。而Keil 4在这方面功能较弱,可考虑升级到Keil 5以获得更好的开发体验[^1]。 4. **注意静态变量使用**:在KEIL MDK中不能定义同名的`static`变量,哪怕是局部变量也不行,且编译器不会对此进行检查,容易出错。因此在定义静态变量时,要确保名称的唯一性,避免因同名静态变量导致值相互影响的问题[^2]。 5. **使用`__weak`关键字**:在Keil MDK中,`__weak`关键字可用于指导编译器弱导出符号,可用于函数变量声明以及函数定义。当存在同名的非弱定义函数定义函数时,对该函数的所有调用都将解析为调用非弱函数,可利用这一特性来处理同名函数的问题,但使用时需注意其存在的限制条件,如函数变量不能在同一编译中同时弱非弱使用等[^4]。 ### 示例代码 ```c // 定义一个用于计算平均值的函数 float calculateAverage(int arr[], int size) { int sum = 0; for (int i = 0; i < size; i++) { sum += arr[i]; } return (float)sum / size; } int main() { int numbers[] = {1, 2, 3, 4, 5}; int arraySize = sizeof(numbers) / sizeof(numbers[0]); // 定义一个存储平均值的变量 float averageValue = calculateAverage(numbers, arraySize); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客 - L U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值