Полная версия этой страницы:
Почему не стартует main?
Vladimir_T
Sep 11 2007, 08:48
Использую Keil и JLink, АРМ STR912. Отладчиком благополучно прохожу по шагам StartUp, а к метке main программа не переходит, генерируется Abort, причем - это на программе более 100 кБ, а программы небольшие прекрасно работают и отлаживаются. В чем может быть дело-то?
В startup:
IMPORT __main
LDR R0, =__main
BX R0
Причем, в R0 находится адрес main (проверил по map-файлу)!
aaarrr
Sep 11 2007, 09:11
А __main находится в том же регионе, что и startup, или где-то еще?
alexander55
Sep 11 2007, 09:21
Цитата(Vladimir_T @ Sep 11 2007, 12:48)

Использую Keil и JLink, АРМ STR912. Отладчиком благополучно прохожу по шагам StartUp, а к метке main программа не переходит, генерируется Abort, причем - это на программе более 100 кБ, а программы небольшие прекрасно работают и отлаживаются. В чем может быть дело-то?
В startup:
IMPORT __main
LDR R0, =__main
BX R0
Причем, в R0 находится адрес main (проверил по map-файлу)!
1. Проверьте по map, что где находится.
2. По результатм скорретируйте размещение данных и памяти программ.
Vladimir_T
Sep 11 2007, 09:26
Из map-файла:
Base Addr Size Type Attr Idx E Section Name Object
0x00000000 0x0000017c Code RO 3 Reset str91x_startup.o
0x0000017c 0x00000008 Code RO 6752 * !!!main __main.o(c_a__un.l)
0x00000184 0x00000038 Code RO 7043 !!!scatter __scatter.o(c_a__un.l)
aaarrr
Sep 11 2007, 11:02
Тогда смотрите адрес и причину Abort'а. Может быть, scatter влезает куда не следует.
Vladimir_T
Sep 11 2007, 11:56
Цитата(aaarrr @ Sep 11 2007, 14:02)

Тогда смотрите адрес и причину Abort'а. Может быть, scatter влезает куда не следует.
А как он работает - этот scatter? И откуда он берется?
Все адресные поля установлены корректно. Не трассируется программа уже после:
BX R0
Почему-то не включается режим записи трассировки (в Кейле), потому что куда-то забегает программа, (вместо того чтобы идти к main) после чего вылетает сюда:
DAbtHandler B DAbtHandler
aaarrr
Sep 11 2007, 12:24
Цитата(Vladimir_T @ Sep 11 2007, 15:56)

А как он работает - этот scatter? И откуда он берется?
Scatter копирует код и данные из загрузочной области в рабочие. Подключается линкером.
Цитата(Vladimir_T @ Sep 11 2007, 15:56)

Почему-то не включается режим записи трассировки (в Кейле), потому что куда-то забегает программа, (вместо того чтобы идти к main) после чего вылетает сюда:
DAbtHandler B DAbtHandler
Вот и посмотрите, откуда он туда попадает (R14 - 0x08 для Data Abort).
Vladimir_T
Sep 11 2007, 12:46
Спасибо всем!
Вроде понял: в start_up, дейчтвительно вызывалась функция установки стеков, она и не трассируется. Так вот здесь, видимо и вылетает. Пока система uC/OS не работает, но понял, где искать.
серый волк
Sep 11 2007, 15:52
Цитата(aaarrr @ Sep 11 2007, 16:24)

Scatter копирует код и данные из загрузочной области в рабочие. Подключается линкером.
Вот и посмотрите, откуда он туда попадает (R14 - 0x08 для Data Abort).
я правильно понимаю соответствие Вашего высказывания "копирует код и данные из загрузочной области в рабочие" тому , что в описании трактуется как regions in load view and regions in executed View ?
Спасибо
aaarrr
Sep 11 2007, 16:03
Цитата(серый волк @ Sep 11 2007, 19:52)

я правильно понимаю соответствие Вашего высказывания "копирует код и данные из загрузочной области в рабочие" тому , что в описании трактуется как regions in load view and regions in executed View ?
Ну да, это и имелось в виду.
MALLOY2
Sep 12 2007, 07:38
У меня была похожая проблема, суть ее заключалась в следующем в STR912 размер флеш памяти задается в регистре и по умолчанию равен 32к !!!!!!!, так вот код который включал всю флеш 512к на ходился за пределами 32к, вылечилось путем размещения кода в своей секции которая лежит в 32к памяти.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.