Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неправильно отрабатывают условия ">" и "<" в IAR-е (микроконтроллер AT91SAM7X256)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Igor_F
Подскажите, сталкивался ли кто-нибудь с подобной проблемой: при проверки условий "больше-меньше" (видим это в отладчике) программа явно неправильно проверяет эти условия в for-ах, if-ах и т.п.

Например:

for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ ) // здесь configMAX_PRIORITIES=255
{
vListInitialise( ( xList * ) &( pxReadyTasksLists[ uxPriority ] ) );
}

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

Если кто-то встречался с данной проблемой, подскажите, как с ней бороться.
msalov
а как обьявлена uxPriority и configMAX_PRIORITIES? может покажите.
axle
Какой тип у uxPriority?
KAlex
signed? unsigned?
richie
Цитата(Igor_F @ Apr 10 2008, 09:51) *
for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ )


uxPriority как догадываюсь имеет тип "signed char" ?
Dir
Цитата(richie @ Apr 10 2008, 10:13) *
uxPriority как догадываюсь имеет тип "signed char" ?


wink.gif Тоже так думаю, что напутано с объявлениями (или присвоениями) типа char по умолчанию (radio button "plain char is" в настройке компилятора). Вот и путает 255 с -1;
Igor_F
Не знаю какая разница "unsigned char uxPriority" и "char uxPriority"
ведь у нас явное присвоение "0", а не 255 или -1. Так что хоть раз должен был зайти в цикл.
Так что указание знаковая она или беззнаковая роли не играет. Но на всякий случай она "unsigned"
vet
неплохо бы увидеть объявления всех переменных, упомянутых в примере, и получившийся ассемблерный листинг.
KRS
А вы листинг смотрели? ( как IAR это на асме представил).
Igor_F
Листинг выглядит следующим образом:

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
vet
собственно, всё верно;
к компилятору претензий нет, условие выхода из цикла скомпилировалось, как задумано.
Сергей Борщ
Цитата(Igor_F @ Apr 15 2008, 09:52) *
Листинг выглядит следующим образом:
А для кого придуманы теги [ code ] и [ /code ]? Зачем сделали кнопку с символом '#' в форме ввода сообщения?
Покажите объявления всех использованых переменных и прототипы функций. Вы хотите, чтобы вам помогли или поиграть в партизана и телепатов?
IgorKossak
Согласно листингу всё должно работать.
Шагами по ассемблеру пробовали пройтись?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.