Сколько можно наступать на одни и те же грабли?.. Пора их положить на полку, на самое видное место.
1. Неправильно меняю типизированный указатель. При изменении (например, инкрементировании) указателя забываю, что у него есть тип, и от размера этого типа зависит результат - какой адрес получится. Например, при вычислении абсолютного адреса почтового ящика CAN я написал:
AT91PS_CAN_MB CAN_Mailbox = AT91C_BASE_CAN0_MB0 + 0x20 * numMailbox;
В результате если, например, numMailbox==2, то получаю ошибочный адрес 0xFFFD0A00 вместо правильного 0xFFFD0240, так к AT91C_BASE_CAN0_MB0 прибавится не 0x20*2, как я хотел, а 0x20 * (sizeof(AT91PS_CAN_MB)*2).
Правильно надо было написать:
AT91PS_CAN_MB CAN_Mailbox = AT91C_BASE_CAN0_MB0 + numMailbox;
После такого вычисления получится правильный адрес 0xFFFD0240, так как к AT91C_BASE_CAN0_MB0 прибавится numMailbox размеров AT91PS_CAN_MB, т. е. в нашем примере sizeof(AT91PS_CAN_MB)*2 или 0x20*2.
2. Warning[Pa082]: undefined behavior: the order of volatile accesses is ...\at91lib\peripherals\can\can.c 117
Такое предупреждение возникает, если в выражении используется две переменные с атрибутом volatile, например (тут в правой стороне выражения регистры интерфейса CAN, которые имеют атрибут volatile, а слева обычная переменная u32):
canstatus = (AT91C_BASE_CAN0->CAN_SR) & (AT91C_BASE_CAN0->CAN_IMR);
исправить эту ошибку можно так:
canstatus = AT91C_BASE_CAN0->CAN_SR;
canstatus &= AT91C_BASE_CAN0->CAN_IMR;
Еще пример такого же предупреждения (и в левой, и в правой части выражения переменные имеют атрибут volatile):
mailbox_in_use |= 1<<(pTransfer->mailbox_number);
исправить эту ошибку можно так:
mailbox_in_use = pTransfer->mailbox_number;
mailbox_in_use <<= 1;
3. ../graphics.c:100: warning: assignment discards qualifiers from pointer target type
Предупреждение возникло в AVR Studio (GCC) на следующий код:
const u8 ZXFONT [] = {...};
u8* adr;
adr = ZXFONT + (symcode-0x20)*8;
Проблема была в том, что я неправильно объявил указатель adr. Надо было объявить его, как и массив ZXFONT, с атрибутом const:
const u8* adr;
|