Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Help, Программа под ARM зацикливается при делении (%)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
_ijor_
Помогите разобраться ,pls
Может кто сталкивался с проблемой зацикливания программы при выполнении операции взятия остатка от деления

signed int temp;

temp%=1000;

пишу на С, компилятор Keil
Ниже приведена функция которую подставляет компилятор для выполнения деления, точками отмечено участок кода в котором программа зацикливается при этом содержимое регистров не меняется

?C?SDIV?A:
0x00015670 E211C102 ANDS R12,R1,#0x80000000
0x00015674 42611000 RSBMI R1,R1,#0x00000000
0x00015678 E03CB040 EORS R11,R12,R0,ASR #32
0x0001567C 22600000 RSBCS R0,R0,#0x00000000
0x00015680 E1B08001 MOVS R8,R1
0x00015684 0A00000D BEQ 0x000156C0
0x00015688 E15800A0 CMP R8,R0,LSR #1
0x0001568C 91A08088 MOVLS R8,R8,LSL #1
0x00015690 3AFFFFFC BCC 0x00015688
· 0x00015694 E1500008 CMP R0,R8
· 0x00015698 E0ACC00C ADC R12,R12,R12
· 0x0001569C 20400008 SUBCS R0,R0,R8
· 0x000156A0 E1380001 TEQ R8,R1
· 0x000156A4 11A080A8 MOVNE R8,R8,LSR #1
· 0x000156A8 1AFFFFF9 BNE 0x00015694
0x000156AC E1A0100C MOV R1,R12
0x000156B0 E1B0B08B MOVS R11,R11,LSL #1
0x000156B4 22611000 RSBCS R1,R1,#0x00000000
0x000156B8 42600000 RSBMI R0,R0,#0x00000000
0x000156BC E12FFF1E BX R14
0x000156C0 E3E01000 MVN R1,#0x00000000
0x000156C4 E3A00000 MOV R0,#0x00000000
0x000156C8 E12FFF1E BX R14
0x000156CC FFFFFFFF (???)

По всей видимости проблемы из за стека, хотя изменение размера стека не устраняет глюк. Использую в программе swi, irq

Undefined Mode 0x0000 0020
Supervisor Mode 0x0000 0020
Abort Mode 0x0000 0020
Fast Interrupt Mode 0x0000 0020
Interrupt Mode 0x0000 0800
User/System Mode 0x0000 0800


Знающие люди рекомендовали обратить внимание на CSTACK,но чем он отличается от стека User/System режима при условии, находимся в этом режиме я понять не могу?
drovik
Не понял... Вообще регистры не меняются в это цикле ? А как проверялось ?
_ijor_
Цитата(drovik @ Sep 19 2008, 16:19) *
Не понял... Вообще регистры не меняются в это цикле ? А как проверялось ?


Я смотрел в дебагере в режиме пошагового выполнения.
scifi
У меня как-то раз было что-то похожее. Программа изредка повисала в бесконечном цикле (вернее, в конечном, но очень длинном - ~2^32 итераций) в одной из математических функций. Оказалось, что мой код входа и выхода из прерывания был с ошибкой, которая проявлялась при вложенном прерывании (прерывание с высоким приоритетом происходило во время обработки прерывания с более низким приоритетом). При этом код выхода из прерывания неправильно восстанавливал регистр состояния процессора. Искажение флагов процессора приводило к скрытому сбою в программе.
_ijor_
Глюк пропадает если отказаться от прерывания модуля I2C

Очень похоже что у меня то -же что -то с прерываниеями не то. В программе разрешено только два прерывания от I2C и uart. Если закоментировать I2C глюк пропадает. Но вложеные прерывания я не использую, т.е. не включаю, если не ошибаюсь то по умолчанию они отключины
scifi
Прерывания I2C происходят часто? Если да, то, возможно, источник прерываний не важен. Просто наиболее частое прерывание быстрее приводит к сбою.
Если "обёртки" для обработки прерываний свои, то надо смотреть на них. Если взяты готовые из надёжных источников - то, скорее всего, не надо.
Что за чип? У меня был STR710.
MrYuran
Цитата(_ijor_ @ Sep 22 2008, 15:53) *
Глюк пропадает если отказаться от прерывания модуля I2C

А обработчик-то есть?
Обычно так бывает, когда прерывание разрешено, а обработчик не описан. Соответственно, по вектору программа улетает чёрт те куда.
_ijor_
Цитата(MrYuran @ Sep 22 2008, 16:19) *
А обработчик-то есть?
Обычно так бывает, когда прерывание разрешено, а обработчик не описан. Соответственно, по вектору программа улетает чёрт те куда.


Это есть, иначе бы память на I2C не работала)



Кажется появилась зацепка. Я в обработчике прерываний I2C использую вложенное SWI прерывание для работы с FIFO буфером, по сей видимости дело может быть в нём...

Использую проц LPC2108, запускал программу на LPC2214 симпттомы были те-же.
_ijor_
Кажется появилась зацепка. Я в обработчике прерываний I2C использую вложенное SWI прерывание для работы с FIFO буфером, по сей видимости дело может быть в нём...



Прерывания происходят довольно часто, i2c работает на частоте 40КГц
Использую проц LPC2108, запускал программу на LPC2214 симпттомы были те-же.
_ijor_
В общем проблему решил убрав из прерывания I2C вызов SWI прерываний, почему ошибка происходила только в мат функциях так и не понял, хотя может и не только, но в них было заметней всего.

Всем спасибо за помощь!
aaarrr
Цитата(_ijor_ @ Sep 26 2008, 15:48) *
В общем проблему решил убрав из прерывания I2C вызов SWI прерываний

А из остальных мест убрали? Если нет, то это не решение, а усугубление проблемы.
_ijor_
Цитата(aaarrr @ Sep 26 2008, 15:50) *
А из остальных мест убрали? Если нет, то это не решение, а усугубление проблемы.


Можно поподробнее?
Нет не убрал, вить при вызове SWI прерывания происходит переход в режим supervisor и все прерывания автоматически запрещаются
aaarrr
Цитата(_ijor_ @ Sep 29 2008, 17:03) *
Можно поподробнее?

Дык нужно ведь разобраться, что именно там у Вас SWI рушит. Иначе рискуете наступить на те же грабли снова.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.