• 请不要在回答技术问题时复制粘贴 AI 生成的内容
amiwrong123
V2EX  ›  程序员

51 单片机里,直接操作内存为什么不能点亮灯?

  •  
  •   amiwrong123 · May 15, 2022 · 5225 views
    This topic created in 1632 days ago, the information mentioned may be changed or developed.

    如上,如果用P1 = 0xfd;就能点亮 P1 的第一个灯,但是用*(unsigned char*)(0x90) = 0xfd;就点不亮。但是我看这两句的汇编代码都是一样的MOV (0x90), #0xfd。

    Supplement 1  ·  May 15, 2022

    不好意思,上面的*(unsigned char*)(0x90) = 0xfd;的汇编是错的。确实是不一样(应该先编译,再debug看汇编)。如下:

    前者P1 = 0xfd;是:

    MOV (0x90), #0xfd
    

    后者*(unsigned char*)(0x90) = 0xfd;是

    MOV      R0,#P1(0x90)
    MOV      @R0,#0xFD
    

    但看起来没有本质区别阿,MOV @R0,#0xFD这句起到的作用应该和MOV (0x90), #0xfd一样吧

    18 replies  •  2022-05-22 20:57:24 +08:00
    pca7a2
    pca7a2
    May 15, 2022
    1
    md5sum 对比一下
    liyang5945
    liyang5945
    May 15, 2022
    2
    刚好我也在学单片机,我刚才试了一下,的确不能点亮,我猜测是通过 sfr 声明的地址才能操作端口的电平,不知道你这个汇编代码是怎么弄出来的,我对比了一下生成的 hex 文件,里面有很多处不同的
    amiwrong123
    amiwrong123
    OP
    May 15, 2022
    3
    @liyang5945 #2
    点击 start debug session ,view 开启汇编窗口。
    hex 不同是因为前者只有一句汇编,后者有两句汇编。但看了汇编,感觉没有本质区别,都是往内存引用里 赋值。
    wty
    wty
    May 15, 2022❤️2
    5
    51 分什么直接寻址间接寻址,跟现代 X86 和 ARM 这种不太一样
    RAM 的低 128 字节作为内存(前几个字节还跟寄存器复用),可以用 MOV 和 MOV @ R0 这种操作
    高 128 字节跟 SFR 复用,只有直接 MOV 会被解释为操作 SFR ,用 MOV @ R0 操作会被解释为操作 RAM
    XRAM 需要用 MOVX 访问,Flash 需要用 MOVC 访问

    51 这种蛋疼的访问方式让指针也很麻烦,memcpy 甚至用了一个大 switch 去把每种情况都写了一遍。。。。
    statumer
    statumer
    May 15, 2022 via iPhone❤️1
    6
    直接寻址访问 sfr ,间接寻址访问用户内存区
    RoyLaw
    RoyLaw
    May 15, 2022
    7
    我都毕业快二十年了,大家还在玩 51 单片机嘛?你试试用二进制来操作。
    liuxu
    liuxu
    May 15, 2022
    8
    @RoyLaw 我十年前毕业学的郭天祥的 51 单片机,看上去 OP 现在还是在学郭天祥的
    someonesnone
    someonesnone
    May 15, 2022 via iPhone
    9
    操作 ram 和 sfr 的汇编不一样吧 所以直接写入端口寄存器需要特殊的方法
    disk
    disk
    May 15, 2022
    10
    所谓本质需要追溯到汇编阶段,译码阶段甚至是执行阶段。。。注意某些特殊规定。
    zbianbiaos
    zbianbiaos
    May 15, 2022
    11
    51 是哈佛结构吧(不确定啊),外设没有统一地址管理,SFR 应该是特殊映射寄存器,将一个特殊的地址空间映射到 P1 变量,而不是你能够正常寻址的用户地址空间
    anonydmer
    anonydmer
    May 16, 2022
    12
    十几年前我可以点亮,现在也点不亮咯
    qwertyssp
    qwertyssp
    May 16, 2022
    13
    既然都看到汇编了,这两句怎么能是等价呢?
    aru
    aru
    May 16, 2022
    14
    啥时候教学才能替换为 mips 、arm 、riscv 架构的廉价单片机啊
    Takizawa
    Takizawa
    May 16, 2022 via Android
    15
    @aru 等那一批人退休🌝🌝
    Halry
    Halry
    May 17, 2022 via iPhone
    16
    51 不是哈弗结构,所以不能直接通过操作内存来控制外设,arm 是,所以可以直接像操作内存的方式操作外设
    amiwrong123
    amiwrong123
    OP
    May 17, 2022
    17
    @Halry #16
    老哥,不是很懂为什么 是否为哈佛结构 会影响到 能否通过操作内存来控制外设。

    从知乎上来看:
    哈佛结构与冯诺依曼结构的本质区别在用是否使用同一套地址总线、数据总线,程序和数据是否统一寻址。比如代码地址是从 0~100k ,数据也是从 0~100k 这是哈佛结构,如果代码是从 0~100k ,数据是从 100~200k 并且使用同一套地址总线和数据总线这是冯诺依曼结构。

    程序和数据是否统一寻址 为什么会影响到 能否通过操作内存来控制外设阿?
    Halry
    Halry
    May 22, 2022 via iPhone
    18
    @amiwrong123 抱歉,是我记混了,确实不关架构的问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5473 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 02:06 · PVG 10:06 · LAX 18:06 · JFK 21:06
    ♥ Do have faith in what you're doing.