У меня есть 32-битный регистр R с различными битовыми полями, объявленными следующим образом:
typedef union {
uint32_t raw;
struct {
uint32_t F1 : 0x4;
uint32_t F2 : 0x8;
uint32_t F3 : 0x8;
uint32_t F4 : 0xC;
}
} reg1
У меня также есть макрос regWrite, который читает-изменяет-записывает поле в регистр следующим образом:
#define RegWrite(Reg, Field, Addr, Val) do {
Reg.raw = read32(Addr);
Reg.Field = Val;
write32(Addr, Reg.raw);
} while(0)
Теперь я хотел усовершенствовать модуль RegWrite для дополнительного вывода сценария на консоль вместо собственно аппаратного программирования, чтобы его можно было сохранить и повторно запустить в более поздний момент времени.
Например, если я вызову regWrite следующим образом:
regWrite(reg1, F2, 0x12345678, 0xC)
Вывод на печать из макроса должен выглядеть примерно так:
set variable1 [read 32 0x12345678]
set variable1 [ ($variable1 & 0xFFFFF00F) | (0xC << 4) ]
write 32 0x12345678 variable1
Как бы я сгенерировал 0xFFFFF00F, и4 внутри макроса? Спасибо!