AF
Size: a a a
AF
AF
AF
AF
AF
AF
AF
C
#define RG_ADDR 0xA8800800даёт немного другой "выхлоп"
typedef struct RG_Params_s
{
uint32_t:12;
uint32_t PAR_1:1;
uint32_t PAR_2:1;
uint32_t PAR_3:1;
uint32_t :1;
uint32_t PAR_4:16;
}RG_Params_t;
volatile RG_Params_t *RG_OUT=(volatile RG_Params_t*) RG_ADDR;
void InitRGC()
{
RG_Params_t OutCfg;
memset(&OutCfg,0,sizeof(OutCfg));
OutCfg.PAR_1=1;
OutCfg.PAR_2=0;
OutCfg.PAR_3=1;
OutCfg.PAR_4=0;
*RG_OUT=OutCfg;
}
InitRGC:и всё работает как надо.
lw $v0, RG_OUT
nop
addiu $sp, -8
li $v1, 0x5000
sw $v1, 0($v0)
addiu $sp, 8
jr $ra
nop
BU
AD
OutCfg, а в С++ — *RG_ADDR, и часть битов в OutCfg остается не инициализрованными, отсюда и UB.SS
SK
SS
C
volatile RG_Params_s *RG_OUT_p=(volatile RG_Params_s*) RG_ADDR;То компилятор говорит
void InitRG()
{
RG_Params_s OutCfg;
memset(reinterpret_cast<void*>(&OutCfg),0,sizeof(RG_Params_s));
OutCfg.PAR_1=1;
OutCfg.PAR_2=0;
OutCfg.PAR_3=1;
OutCfg.PAR_4=0;
//memcpy(reinterpret_cast<void*>(RG_ADDR),&OutCfg,sizeof(RG_Params_s));
*RG_OUT_p=OutCfg;
}
error: passing 'volatile RG_Params_s' as 'this' argument of 'RG_Params_s& RG_Params_s::operator=(const RG_Params_s&)' discards qualifiers [-fpermissive]
Поэтому и мемкопи. Ибо я не очень понял как это поборотьSK