Size: a a a

2021 July 02

AF

Aidar Fattakhov in pro.cxx
Чеза зона такая, уверен что компилятор умеет вобще в такое?
источник

AF

Aidar Fattakhov in pro.cxx
Если да это гдето в линкерскрипте должно быть
источник

AF

Aidar Fattakhov in pro.cxx
Как и НОРМАЛЬНЫЙ ОБЪЕКТ вместо адреса
источник

C

Chuvi in pro.cxx
а нормальный объект вместо адреса что даст?
источник

AF

Aidar Fattakhov in pro.cxx
Присутствие объекта
источник

AF

Aidar Fattakhov in pro.cxx
Отсутствие реинтерпреткаста
источник

AF

Aidar Fattakhov in pro.cxx
Отсутствие мемкопи
источник

AF

Aidar Fattakhov in pro.cxx
А volatile битфилды бывают?
источник

C

Chuvi in pro.cxx
Что интересно, почти похожий код на С
#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

и всё работает как надо.
источник

C

Chuvi in pro.cxx
ну мемкопи там изначально потому что я не смог впихнуть non-volatile в volatile при помощи банального присвоения
компилятор ругается и вопит что так нельзя
источник

BU

Boris Usievich in pro.cxx
ну так в чем проблема? выносите этот код в отдельный файлик и компилируете его  как C
источник

C

Chuvi in pro.cxx
проблема в том, что он изначально на С написан. Я тут пытаюсь провести акцию под названием "мы можем использовать С++". Но пока чёт блин провал.
источник

AD

Andrey Davydov in pro.cxx
Код на С похож, да не совсем. В нем вы зануляете OutCfg, а в  С++ — *RG_ADDR, и часть битов в OutCfg остается не инициализрованными, отсюда и UB.
источник

C

Chuvi in pro.cxx
Прикольно.
поменял на memset(reinterpret_cast<void*>(&OutCfg),0,sizeof(RG_Params_s)); - судя по выхлопу - должно работать.
источник

SS

Sergey Sobolev in pro.cxx
Ага, только хотел написать, что подозрительное зануление RG_ADDR вместо Outcfg
источник

SK

Stas Koynov in pro.cxx
и где тут ваш эквивалент вообще не понятно? они зануляют структуру на стеке вы не пойми где. они тупо делают присвоение инта вы делаете мемкопи. они пишут по адресу  ADDR_OLU_RG_NISP_OUT вы по RG_ADDR
источник

SS

Sergey Sobolev in pro.cxx
Теперь должно быть ок
источник

C

Chuvi in pro.cxx
потому что если сделать так
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

Stas Koynov in pro.cxx
RG_Params_s это POD биты в порядке как лежат в железе. мы знаем из датошита адрес этого дела. откуда оператор, вы что из него класс сделали? что вы придумываете.
источник

C

Chuvi in pro.cxx
Нет, я не делал из него класс. Сам удивился от такой ругани компилятора.
И я не придумываю (незачем), я просто скопировал то, что выдал компилятор
источник