598330983 发表于 2025-6-6 19:13

移至一份arm程序到51,遇到问题,花了一天解决了

Keil C251/C51 关键字列表(应避免用作变量名)
在 Keil C251/C51 开发中,以下关键字具有特殊含义(存储类别、寄存器名、指令等),不能用作变量名或结构体成员名,否则会导致编译错误或移植问题:

1. 存储类别关键字(Memory Space Specifiers)
这些关键字用于指定变量的存储位置:


关键字说明示例
data直接寻址的内部 RAM(0-127B)unsigned char data var;
idata间接寻址的内部 RAM(0-255B)unsigned char idata var;
xdata外部扩展 RAM(64KB)unsigned int xdata var;
pdata分页外部 RAM(256B)unsigned char pdata var;
code程序存储器(Flash/ROM)const unsigned char code table[] = {...};
bdata可位寻址的内部 RAM(20H-2FH)unsigned char bdata flags;




2. 特殊功能寄存器(SFR)关键字
8051 的特殊寄存器名,如:

sfr P0 = 0x80;   // 端口0
sfr P1 = 0x90;   // 端口1
sfr SP = 0x81;   // 堆栈指针
sfr PSW = 0xD0;// 程序状态字


3. 位寻址关键字

关键字        说明
bit        定义位变量
sbit        定义特殊功能寄存器的位


sbit LED = P1^0;// 定义 P1.0 为 LED
bit flag = 0;   // 定义一个位变量


4. 其他保留关键字
关键字        冲突场景
interrupt        中断函数修饰符
using        指定中断使用的寄存器组
reentrant        可重入函数修饰符
_at_        绝对地址定位(如 int x _at_ 0x8000;)
5. 跨平台移植注意事项
如果代码需要移植到其他平台(如 STM32、ESP32),还需避免:

C/C++ 标准关键字(如 class、new、delete 等)

平台专用关键字(如 ARM 的 __irq、STM32 HAL 的 GPIO_Pin)

常见冲突名称(如 count、buffer、addr 等可能与库冲突)

598330983 发表于 2025-6-6 19:13

建议的变量命名规则
避免使用单字母或短单词(如 data、code、p),改用描述性名称:

✅ fontData 代替 data

✅ memBuffer 代替 buffer

添加前缀/后缀 区分用途:

pData 表示指针(Pointer)

u8Value 表示 8 位无符号数

检查编译器手册:不同编译器(如 SDCC、IAR)可能有额外保留字。

抱素 发表于 2025-9-27 16:09

将 ARM 程序移植到 51 单片机,因架构差异遇诸多问题:寄存器操作、中断机制不同,ARM 的 32 位指令需转为 51 的 8 位,内存管理也需重写。花一天时间逐句适配,调整时序和资源分配,最终解决兼容性问题,程序正常运行。
页: [1]
查看完整版本: 移至一份arm程序到51,遇到问题,花了一天解决了