|
|
  |
Help, Программа под ARM зацикливается при делении (%) |
|
|
|
Sep 16 2008, 21:01
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 19-06-07
Пользователь №: 28 545

|
Помогите разобраться ,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 режима при условии, находимся в этом режиме я понять не могу?
|
|
|
|
|
Sep 19 2008, 12:19
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 7-05-07
Пользователь №: 27 573

|
Не понял... Вообще регистры не меняются в это цикле ? А как проверялось ?
|
|
|
|
|
Sep 22 2008, 11:34
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 19-06-07
Пользователь №: 28 545

|
Цитата(drovik @ Sep 19 2008, 16:19)  Не понял... Вообще регистры не меняются в это цикле ? А как проверялось ? Я смотрел в дебагере в режиме пошагового выполнения.
|
|
|
|
|
Sep 22 2008, 11:53
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 19-06-07
Пользователь №: 28 545

|
Глюк пропадает если отказаться от прерывания модуля I2C
Очень похоже что у меня то -же что -то с прерываниеями не то. В программе разрешено только два прерывания от I2C и uart. Если закоментировать I2C глюк пропадает. Но вложеные прерывания я не использую, т.е. не включаю, если не ошибаюсь то по умолчанию они отключины
|
|
|
|
|
Sep 22 2008, 13:46
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 19-06-07
Пользователь №: 28 545

|
Цитата(MrYuran @ Sep 22 2008, 16:19)  А обработчик-то есть? Обычно так бывает, когда прерывание разрешено, а обработчик не описан. Соответственно, по вектору программа улетает чёрт те куда. Это есть, иначе бы память на I2C не работала) Кажется появилась зацепка. Я в обработчике прерываний I2C использую вложенное SWI прерывание для работы с FIFO буфером, по сей видимости дело может быть в нём... Использую проц LPC2108, запускал программу на LPC2214 симпттомы были те-же.
Сообщение отредактировал _ijor_ - Sep 22 2008, 13:45
|
|
|
|
|
Sep 23 2008, 10:41
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 19-06-07
Пользователь №: 28 545

|
Кажется появилась зацепка. Я в обработчике прерываний I2C использую вложенное SWI прерывание для работы с FIFO буфером, по сей видимости дело может быть в нём...
Прерывания происходят довольно часто, i2c работает на частоте 40КГц Использую проц LPC2108, запускал программу на LPC2214 симпттомы были те-же.
Сообщение отредактировал _ijor_ - Sep 23 2008, 10:42
|
|
|
|
|
Sep 26 2008, 11:48
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 19-06-07
Пользователь №: 28 545

|
В общем проблему решил убрав из прерывания I2C вызов SWI прерываний, почему ошибка происходила только в мат функциях так и не понял, хотя может и не только, но в них было заметней всего.
Всем спасибо за помощь!
|
|
|
|
|
Sep 29 2008, 13:03
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 19-06-07
Пользователь №: 28 545

|
Цитата(aaarrr @ Sep 26 2008, 15:50)  А из остальных мест убрали? Если нет, то это не решение, а усугубление проблемы. Можно поподробнее? Нет не убрал, вить при вызове SWI прерывания происходит переход в режим supervisor и все прерывания автоматически запрещаются
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|