找回密码
 立即注册
查看: 256|回复: 16

大神救我,无法把数据存入00H中

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-07 16:51:18
已绑定手机

5

主题

17

回帖

119

积分

注册会员

积分
119
发表于 2025-3-31 08:43:37 来自手机 | 显示全部楼层 |阅读模式
unsigned char *ptr0=(unsigned char *)0x00,*ptr1=(unsigned char *)0x01;
unsigned int p;
p=(*ptr1<<8)|(*ptr0);
if(P54)
{
delay(2000);
while(P54)
{
if(P32)
{
*ptr1=0x01;
*ptr0=0x2c;
while(P32);
}else{
*ptr1=0x00;
*ptr0=0xB4;
while(!P32);
}
}
}
以上是我的程序,现在读取出来的p应该是0xff,而不是0xffff,也不是我设置的0x012c和0x00b4。
这是为什么?第一,8位的*ptr1左移8位的时候是不是一定要先把他存入16位的变量中吗?第二,为什么我存的数据无效?
回复

使用道具 举报 送花

3

主题

691

回帖

93

积分

等待验证会员

积分
93
发表于 2025-3-31 08:48:00 | 显示全部楼层
您好,从您提供的代码片段来看,您似乎遇到了无法将数据存入地址 0x00 的问题。以下是对问题的分析和可能的解决方案:

问题分析
1. 地址 0x00 的特殊性:
在许多嵌入式系统中,地址 0x00 可能是一个特殊的内存区域,例如复位向量表、中断向量表或其他硬件相关的寄存器。直接向该地址写入数据可能会导致未定义行为或系统崩溃。
如果 0x00 是只读内存或受保护的内存区域,写入操作会被硬件阻止。

2. 指针定义与使用:
您定义了两个指针 ptr0 和 ptr1,分别指向地址 0x00 和 0x01。这种直接操作绝对地址的方式需要确保目标地址是可写的。
在代码片段中,p=(ptr1) 只是从地址 0x01 读取数据,并未涉及向 0x00 写入数据。因此,问题可能出在其他未展示的代码部分。

3. 数据类型与操作:
unsigned char ptr0 和 unsigned char ptr1 是正确的定义,适合操作 8 位数据。
如果目标是向 0x00 写入数据,需要明确写入操作,例如 ptr0 = value;。

解决方案
1. 检查目标地址的可写性:
确认地址 0x00 是否可写。可以查阅芯片手册或内存映射表,了解该地址的具体用途。
如果 0x00 是只读或受保护的区域,尝试使用其他可写地址。

2. 明确写入操作:
如果确认 0x00 可写,确保代码中包含明确的写入操作。例如:
   
  1. c
  2.      ptr0 = 0xAA; // 向地址 0x00 写入数据 0xAA
复制代码

3. 调试与验证:
使用调试工具(如 JTAG、SWD)检查写入操作是否成功。
如果写入失败,检查硬件保护机制或内存映射配置。

4. 替代方案:
如果 0x00 不可写,尝试使用其他地址或动态分配内存。例如:
   
  1. c
  2.      unsigned char data = 0xAA;
  3.      unsigned char ptr = &data; // 使用变量地址
复制代码

示例代码
以下是一个完整的示例,展示如何正确地向指定地址写入数据:
  1. c
  2. include
  3. int main() {
  4.     unsigned char ptr0 = (unsigned char )0x00; // 指向地址 0x00
  5.     unsigned char ptr1 = (unsigned char )0x01; // 指向地址 0x01
  6.     // 检查地址 0x00 是否可写(假设可写)
  7.     ptr0 = 0xAA; // 向地址 0x00 写入数据 0xAA
  8.     // 从地址 0x01 读取数据
  9.     unsigned int p = ptr1;
  10.     printf("Data at 0x00: 0x%02X\n", ptr0);
  11.     printf("Data at 0x01: 0x%02X\n", p);
  12.     return 0;
  13. }
复制代码

总结
无法将数据存入地址 0x00 的原因可能是目标地址不可写或受保护。建议检查内存映射表,确认地址的可写性,并确保代码中包含明确的写入操作。如果问题仍然存在,可以尝试使用调试工具进一步分析。希望以上分析对您有所帮助!

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:69
  • 最近打卡:2025-06-18 08:16:29
已绑定手机

17

主题

472

回帖

1349

积分

金牌会员

积分
1349
发表于 2025-3-31 09:59:29 | 显示全部楼层
地址00是R0,编译器会使用这些寄存器,程序没跑跑飞就不错了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-06-18 05:41:00

50

主题

168

回帖

1775

积分

金牌会员

积分
1775
发表于 2025-3-31 10:23:57 | 显示全部楼层
非用不可的话,修改寄存器工作组
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:500
  • 最近打卡:2025-06-18 01:56:03
已绑定手机

14

主题

1312

回帖

3356

积分

论坛元老

积分
3356
发表于 2025-3-31 10:47:06 | 显示全部楼层
除了楼上分析的不要用系统寄存器地址外(可能和C编译有冲突),要想读p出来是0x012c和0x00b4需要将“p=(*ptr1<<8)|(*ptr0);”移到读p前一句。不移动这句,需要修改这句为unsigned int *p=(unsigned int *)0x00,即指针p指向0x00。

总的来说,建议用汇编来写,内存规划更方便、更灵活;C51的内存规划主要靠编译器。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-07 16:51:18
已绑定手机

5

主题

17

回帖

119

积分

注册会员

积分
119
发表于 2025-3-31 11:38:31 来自手机 | 显示全部楼层
Ayb_ice 发表于 2025-3-31 09:59
地址00是R0,编译器会使用这些寄存器,程序没跑跑飞就不错了

那哪些寄存器可以直接读写的?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:69
  • 最近打卡:2025-06-18 08:16:29
已绑定手机

17

主题

472

回帖

1349

积分

金牌会员

积分
1349
发表于 2025-3-31 11:40:00 | 显示全部楼层
hx12*** 发表于 2025-3-31 11:38
那哪些寄存器可以直接读写的?

可以读,不要去写,因为这是编译器去使用的,这是基本常识,汇编的话可以自己去控制
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-07 16:51:18
已绑定手机

5

主题

17

回帖

119

积分

注册会员

积分
119
发表于 2025-3-31 11:40:20 来自手机 | 显示全部楼层
21cnsound 发表于 2025-3-31 10:47
除了楼上分析的不要用系统寄存器地址外(可能和C编译有冲突),要想读p出来是0x012c和0x00b4需要将“p=(*pt ...

明白了,感谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-07 16:51:18
已绑定手机

5

主题

17

回帖

119

积分

注册会员

积分
119
发表于 2025-3-31 11:41:33 来自手机 | 显示全部楼层
Ayb_ice 发表于 2025-3-31 11:40
可以读,不要去写,因为这是编译器去使用的,这是基本常识,汇编的话可以自己去控制  ...

意思是没有寄存器可以供我们写的吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:69
  • 最近打卡:2025-06-18 08:16:29
已绑定手机

17

主题

472

回帖

1349

积分

金牌会员

积分
1349
发表于 2025-3-31 13:03:30 | 显示全部楼层
hx12*** 发表于 2025-3-31 11:41
意思是没有寄存器可以供我们写的吗?

不用你去控制不好吗,你要关注的是如何控制SFR特殊功能寄存器,如何用RAM实现所需的功能
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-18 15:20 , Processed in 0.141835 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表