hx121200 发表于 2025-3-31 08:43:37

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

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位的变量中吗?第二,为什么我存的数据无效?

国芯人工智能 发表于 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 可写,确保代码中包含明确的写入操作。例如:
   c
   ptr0 = 0xAA; // 向地址 0x00 写入数据 0xAA

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

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

示例代码
以下是一个完整的示例,展示如何正确地向指定地址写入数据:
c
include

int main() {
    unsigned char ptr0 = (unsigned char )0x00; // 指向地址 0x00
    unsigned char ptr1 = (unsigned char )0x01; // 指向地址 0x01

    // 检查地址 0x00 是否可写(假设可写)
    ptr0 = 0xAA; // 向地址 0x00 写入数据 0xAA

    // 从地址 0x01 读取数据
    unsigned int p = ptr1;

    printf("Data at 0x00: 0x%02X\n", ptr0);
    printf("Data at 0x01: 0x%02X\n", p);

    return 0;
}

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

[本文内容由国芯人工智能辅助生成,仅供参考]

Ayb_ice 发表于 2025-3-31 09:59:29

地址00是R0,编译器会使用这些寄存器,程序没跑跑飞就不错了

BeHappy 发表于 2025-3-31 10:23:57

非用不可的话,修改寄存器工作组

21cnsound 发表于 2025-3-31 10:47:06

除了楼上分析的不要用系统寄存器地址外(可能和C编译有冲突),要想读p出来是0x012c和0x00b4需要将“p=(*ptr1<<8)|(*ptr0);”移到读p前一句。不移动这句,需要修改这句为unsigned int *p=(unsigned int *)0x00,即指针p指向0x00。

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

hx121200 发表于 2025-3-31 11:38:31

Ayb_ice 发表于 2025-3-31 09:59
地址00是R0,编译器会使用这些寄存器,程序没跑跑飞就不错了

那哪些寄存器可以直接读写的?

Ayb_ice 发表于 2025-3-31 11:40:00

hx121200 发表于 2025-3-31 11:38
那哪些寄存器可以直接读写的?

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

hx121200 发表于 2025-3-31 11:40:20

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

明白了,感谢

hx121200 发表于 2025-3-31 11:41:33

Ayb_ice 发表于 2025-3-31 11:40
可以读,不要去写,因为这是编译器去使用的,这是基本常识,汇编的话可以自己去控制...

意思是没有寄存器可以供我们写的吗?

Ayb_ice 发表于 2025-3-31 13:03:30

hx121200 发表于 2025-3-31 11:41
意思是没有寄存器可以供我们写的吗?

不用你去控制不好吗,你要关注的是如何控制SFR特殊功能寄存器,如何用RAM实现所需的功能
页: [1] 2
查看完整版本: 大神救我,无法把数据存入00H中