Перейти к содержанию
    

Неправильно отрабатывают условия ">" и "<" в IAR-е (микроконтроллер AT91SAM7X256)

Подскажите, сталкивался ли кто-нибудь с подобной проблемой: при проверки условий "больше-меньше" (видим это в отладчике) программа явно неправильно проверяет эти условия в for-ах, if-ах и т.п.

 

Например:

 

for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ ) // здесь configMAX_PRIORITIES=255

{

vListInitialise( ( xList * ) &( pxReadyTasksLists[ uxPriority ] ) );

}

 

В отладчике видим, что uxPriority дествительно =0, но в цикл мы не попадаем.

С подобной проблемой сталкиваемся постоянно в разных частях программы, хотя вся оптимизация выключена.

 

Если кто-то встречался с данной проблемой, подскажите, как с ней бороться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ )

 

uxPriority как догадываюсь имеет тип "signed char" ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

uxPriority как догадываюсь имеет тип "signed char" ?

 

;) Тоже так думаю, что напутано с объявлениями (или присвоениями) типа char по умолчанию (radio button "plain char is" в настройке компилятора). Вот и путает 255 с -1;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю какая разница "unsigned char uxPriority" и "char uxPriority"

ведь у нас явное присвоение "0", а не 255 или -1. Так что хоть раз должен был зайти в цикл.

Так что указание знаковая она или беззнаковая роли не играет. Но на всякий случай она "unsigned"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

неплохо бы увидеть объявления всех переменных, упомянутых в примере, и получившийся ассемблерный листинг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Листинг выглядит следующим образом:

 

00002C66 BC01 POP {R0}

00002C68 4700 BX R0

00002C6A 0000 LSL R0, R0, #0

static void prvInitialiseTaskLists( void )

{

Next label is a Thumb label

prvInitialiseTaskLists:

00002C6C B510 PUSH {R4, LR}

for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ )

00002C6E 2000 MOV R0, #0

00002C70 1C04 MOV R4, R0

for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ )

00002C72 2CFF CMP R4, #255

00002C74 D207 BCS 0x002C86

vListInitialise( ( xList * ) &( pxReadyTasksLists[ uxPriority ] ) );

00002C76 2014 MOV R0, #20

00002C78 4360 MUL R0, R4

00002C7A 4962 LDR R1, [PC,#0x188] ; [0x2E04] =pxReadyTasksLists (0x2037E8)

00002C7C 1808 ADD R0, R1, R0

00002C7E F7FF ; pre BL/BLX

00002C80 FADB BL vListInitialise ; 0x2238

for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ )

00002C82 1C64 ADD R4, R4, #1

00002C84 E7F5 B 0x002C72

vListInitialise( ( xList * ) &xDelayedTaskList1 );

00002C86 480C LDR R0, [PC,#0x030] ; [0x2CB8] =xDelayedTaskList1 (0x204BD4)

00002C88 F7FF ; pre BL/BLX

00002C8A FAD6 BL vListInitialise ; 0x2238

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

собственно, всё верно;

к компилятору претензий нет, условие выхода из цикла скомпилировалось, как задумано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Листинг выглядит следующим образом:
А для кого придуманы теги [ code ] и [ /code ]? Зачем сделали кнопку с символом '#' в форме ввода сообщения?

Покажите объявления всех использованых переменных и прототипы функций. Вы хотите, чтобы вам помогли или поиграть в партизана и телепатов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласно листингу всё должно работать.

Шагами по ассемблеру пробовали пройтись?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...