(*((volatile unsigned long *)0x400253FC)) = 0x12345678
初级C,只要解析出来。我想你不知道混乱在哪里。
我认为您了解类型转换
unsigned int x; //a variable
x = 0x400253FC; //assign the variable a value
(volatile unsigned long *)x //typecast x into a different type volatile unsigned long *
同样使用指针
volatile unsigned long *z;
(*z)=0x12345678; //at the address pointed to by z place the value 0x12345678;
把它分成几部分。
(
*
(
(volatile unsigned long *)0x400253FC
)
)
0x400253FC a value
(volatile unsigned long *)0x400253FC typecast that value into an unsigned long pointer
((volatile unsigned long *)0x400253FC) enclose that pointer as a whole at this point it is a pointer, like z from above.
*((volatile unsigned long *)0x400253FC) dereference it one level, like *z above you can now use this to manipulate the unsigned long address.
(*((volatile unsigned long *)0x400253FC)) good idea to wrap defines in parens to not confuse the compiler. doesn't hurt.
(*((volatile unsigned long *)0x400253FC)) = 0x12345678. Like *z = 0x12345678 above, write/store 0x12345678 to the address 0x400253FC
#define GPIO_PORTF_DATA_R (*((volatile unsigned long *)0x400253FC))
GPIO_PORTF_DATA_R = 0x12345678; store/write 0x12345678 to the address 0x400253FC
unsigned long k; k = GPIO_PORTF_DATA_R; load/read from address 0x400253FC and save it in k
如果你有一个 8 位宽的寄存器,那么调整类型转换。
#define SOME_8BIT_REG (*((volatile unsigned char *)0x5006789A))
SOME_8BIT_REG = 0x33;
你可以试试
#define GPIO_PORTF_DATA_R (*((volatile unsigned long *)0x400253FC))
#define SOME_8BIT_REG (*((volatile unsigned char *)0x5006789A))
void fun ( void )
{
GPIO_PORTF_DATA_R = 0x12345678;
SOME_8BIT_REG = 0x33;
}
00000000 <fun>:
0: e3a02033 mov r2, #51 ; 0x33
4: e59f1010 ldr r1, [pc, #16] ; 1c <fun+0x1c>
8: e59f0010 ldr r0, [pc, #16] ; 20 <fun+0x20>
c: e59f3010 ldr r3, [pc, #16] ; 24 <fun+0x24>
10: e58103fc str r0, [r1, #1020] ; 0x3fc
14: e5c3209a strb r2, [r3, #154] ; 0x9a
18: e12fff1e bx lr
1c: 40025000
20: 12345678
24: 50067800
10: e58103fc str r0, [r1, #1020] ; 0x3fc
32 bit store (write) 0x12345678 to address 0x400253fc
14: e5c3209a strb r2, [r3, #154] ; 0x9a
8 bit store (write) 0x33 to address 0x5006789a
指令集无关紧要
0000000000000000 <fun>:
0: 48 c7 04 25 fc 53 02 movq $0x12345678,0x400253fc
7: 40 78 56 34 12
c: c6 04 25 9a 78 06 50 movb $0x33,0x5006789a
13: 33
14: c3 retq
Disassembly of section .text:
00000000 <fun>:
0: 123457b7 lui x15,0x12345
4: 40025737 lui x14,0x40025
8: 67878793 addi x15,x15,1656 # 12345678 <fun+0x12345678>
c: 3ef72e23 sw x15,1020(x14) # 400253fc <fun+0x400253fc>
10: 500687b7 lui x15,0x50068
14: 03300713 li x14,51
18: 88e78d23 sb x14,-1894(x15) # 5006789a <fun+0x5006789a>
1c: 8082 ret