Главная arrow Программирование arrow ARM arrow Какие я часто делаю ошибки в языке C Monday, May 01 2017  
ГлавнаяКонтактыАдминистрированиеПрограммированиеСсылки
UK-flag-ico.png English Version
GERMAN-flag-ico.png Die deutsche Version
map.gif карта сайта
нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Поделиться:

Какие я часто делаю ошибки в языке C Версия для печати
Написал microsin   
11.06.2010

Сколько можно наступать на одни и те же грабли?.. Пора их положить на полку, на самое видное место.

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;

 

Последнее обновление ( 11.06.2010 )
 

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:

Защитный код
Обновить

< Пред.   След. >

Top of Page
 
microsin © 2017