ijor 0 16 сентября, 2008 Опубликовано 16 сентября, 2008 · Жалоба Помогите разобраться ,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 0 19 сентября, 2008 Опубликовано 19 сентября, 2008 · Жалоба Не понял... Вообще регистры не меняются в это цикле ? А как проверялось ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ijor 0 22 сентября, 2008 Опубликовано 22 сентября, 2008 · Жалоба Не понял... Вообще регистры не меняются в это цикле ? А как проверялось ? Я смотрел в дебагере в режиме пошагового выполнения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 22 сентября, 2008 Опубликовано 22 сентября, 2008 · Жалоба У меня как-то раз было что-то похожее. Программа изредка повисала в бесконечном цикле (вернее, в конечном, но очень длинном - ~2^32 итераций) в одной из математических функций. Оказалось, что мой код входа и выхода из прерывания был с ошибкой, которая проявлялась при вложенном прерывании (прерывание с высоким приоритетом происходило во время обработки прерывания с более низким приоритетом). При этом код выхода из прерывания неправильно восстанавливал регистр состояния процессора. Искажение флагов процессора приводило к скрытому сбою в программе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ijor 0 22 сентября, 2008 Опубликовано 22 сентября, 2008 · Жалоба Глюк пропадает если отказаться от прерывания модуля I2C Очень похоже что у меня то -же что -то с прерываниеями не то. В программе разрешено только два прерывания от I2C и uart. Если закоментировать I2C глюк пропадает. Но вложеные прерывания я не использую, т.е. не включаю, если не ошибаюсь то по умолчанию они отключины Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 22 сентября, 2008 Опубликовано 22 сентября, 2008 · Жалоба Прерывания I2C происходят часто? Если да, то, возможно, источник прерываний не важен. Просто наиболее частое прерывание быстрее приводит к сбою. Если "обёртки" для обработки прерываний свои, то надо смотреть на них. Если взяты готовые из надёжных источников - то, скорее всего, не надо. Что за чип? У меня был STR710. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 22 сентября, 2008 Опубликовано 22 сентября, 2008 · Жалоба Глюк пропадает если отказаться от прерывания модуля I2C А обработчик-то есть? Обычно так бывает, когда прерывание разрешено, а обработчик не описан. Соответственно, по вектору программа улетает чёрт те куда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ijor 0 22 сентября, 2008 Опубликовано 22 сентября, 2008 (изменено) · Жалоба А обработчик-то есть? Обычно так бывает, когда прерывание разрешено, а обработчик не описан. Соответственно, по вектору программа улетает чёрт те куда. Это есть, иначе бы память на I2C не работала) Кажется появилась зацепка. Я в обработчике прерываний I2C использую вложенное SWI прерывание для работы с FIFO буфером, по сей видимости дело может быть в нём... Использую проц LPC2108, запускал программу на LPC2214 симпттомы были те-же. Изменено 22 сентября, 2008 пользователем _ijor_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ijor 0 23 сентября, 2008 Опубликовано 23 сентября, 2008 (изменено) · Жалоба Кажется появилась зацепка. Я в обработчике прерываний I2C использую вложенное SWI прерывание для работы с FIFO буфером, по сей видимости дело может быть в нём... Прерывания происходят довольно часто, i2c работает на частоте 40КГц Использую проц LPC2108, запускал программу на LPC2214 симпттомы были те-же. Изменено 23 сентября, 2008 пользователем _ijor_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ijor 0 26 сентября, 2008 Опубликовано 26 сентября, 2008 · Жалоба В общем проблему решил убрав из прерывания I2C вызов SWI прерываний, почему ошибка происходила только в мат функциях так и не понял, хотя может и не только, но в них было заметней всего. Всем спасибо за помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 26 сентября, 2008 Опубликовано 26 сентября, 2008 · Жалоба В общем проблему решил убрав из прерывания I2C вызов SWI прерываний А из остальных мест убрали? Если нет, то это не решение, а усугубление проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ijor 0 29 сентября, 2008 Опубликовано 29 сентября, 2008 · Жалоба А из остальных мест убрали? Если нет, то это не решение, а усугубление проблемы. Можно поподробнее? Нет не убрал, вить при вызове SWI прерывания происходит переход в режим supervisor и все прерывания автоматически запрещаются Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 29 сентября, 2008 Опубликовано 29 сентября, 2008 · Жалоба Можно поподробнее? Дык нужно ведь разобраться, что именно там у Вас SWI рушит. Иначе рискуете наступить на те же грабли снова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться