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

Help, Программа под ARM зацикливается при делении (%)

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

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


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

Не понял... Вообще регистры не меняются в это цикле ? А как проверялось ?

 

Я смотрел в дебагере в режиме пошагового выполнения.

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


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

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

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


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

Глюк пропадает если отказаться от прерывания модуля I2C

 

Очень похоже что у меня то -же что -то с прерываниеями не то. В программе разрешено только два прерывания от I2C и uart. Если закоментировать I2C глюк пропадает. Но вложеные прерывания я не использую, т.е. не включаю, если не ошибаюсь то по умолчанию они отключины

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


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

Прерывания I2C происходят часто? Если да, то, возможно, источник прерываний не важен. Просто наиболее частое прерывание быстрее приводит к сбою.

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

Что за чип? У меня был STR710.

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


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

Глюк пропадает если отказаться от прерывания модуля I2C

А обработчик-то есть?

Обычно так бывает, когда прерывание разрешено, а обработчик не описан. Соответственно, по вектору программа улетает чёрт те куда.

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


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

А обработчик-то есть?

Обычно так бывает, когда прерывание разрешено, а обработчик не описан. Соответственно, по вектору программа улетает чёрт те куда.

 

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

 

 

 

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

 

Использую проц LPC2108, запускал программу на LPC2214 симпттомы были те-же.

Изменено пользователем _ijor_

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


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

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

 

 

 

Прерывания происходят довольно часто, i2c работает на частоте 40КГц

Использую проц LPC2108, запускал программу на LPC2214 симпттомы были те-же.

Изменено пользователем _ijor_

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


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

В общем проблему решил убрав из прерывания I2C вызов SWI прерываний, почему ошибка происходила только в мат функциях так и не понял, хотя может и не только, но в них было заметней всего.

 

Всем спасибо за помощь!

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


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

В общем проблему решил убрав из прерывания I2C вызов SWI прерываний

А из остальных мест убрали? Если нет, то это не решение, а усугубление проблемы.

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


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

А из остальных мест убрали? Если нет, то это не решение, а усугубление проблемы.

 

Можно поподробнее?

Нет не убрал, вить при вызове SWI прерывания происходит переход в режим supervisor и все прерывания автоматически запрещаются

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


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

Можно поподробнее?

Дык нужно ведь разобраться, что именно там у Вас SWI рушит. Иначе рискуете наступить на те же грабли снова.

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


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

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

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

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

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

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

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

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

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

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