реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Странное поведение Linker'a в Keil
DO_SL
сообщение Mar 18 2011, 14:33
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 1-11-10
Из: Беларусь, Минск
Пользователь №: 60 563



Здравствуйте, столкнулся со следующей проблемой:
компиляция проекта проходит успешно, но про запуске на выполнение (отладка по С2) вместо того чтобы остановиться на main() и ждать дальнейших указаний программа прыгает неизвестно куда и зацикливается. Т.е. СРАЗУ после нажатия на кнопку Start debug session. При этом, если запустит симулятор, все работает как и должно. Т.е. после нажатия на кнопку Start debug session указатель выполняемой инструкции замирает на первой команде в main().

Плата на C8051F361, не сигналовская макетка. Плата проверена, т.к. программа, которая только инициализирует LCD (зажигает подстветку, выводит стартовое меню и т.д.) работала без проблем. Только при добавлении последующих функций возникают проблемы.

Есть подозрение, что проблема в файле STARTUP, который добавляет сам Keil. С ним не сталкивался, есть ли смысл лезть туда, если да то как? Суда по дизассемблеру, зацикливание происходит именно там.

Еще один вариан -- неверное распределение памяти. В настройках проекта выбран тип Memory model: Large, Code ROM size: LARGE,64KB code.

Спасибо.
Go to the top of the page
 
+Quote Post
barabek
сообщение Mar 18 2011, 23:49
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



А что в регистре сброса RSTSRC в это время?
Go to the top of the page
 
+Quote Post
DO_SL
сообщение Mar 21 2011, 07:50
Сообщение #3





Группа: Участник
Сообщений: 14
Регистрация: 1-11-10
Из: Беларусь, Минск
Пользователь №: 60 563



В регистре сброса RSTSRC -- сброс по WDT. Он по умолчанию включен. Выключается в инициализации. Куда, в свою очередь, программа не попадает sm.gif . Вообщем при помощи бубна и с Вашей помощью сделали следующее: влезли в STARTUP, там отключили цикл обнуления регистров памяти (не помогло) и убили последнюю команду "LJMP ?C_START". По идее, она как раз-то и должна вызывать main(). Вот только вызывает она хз что и зачем (программа падает в бесчисленные циклы и потом ресетится по WDT). Если у кого-то есть мысли по этому поводу, отпишитесь.
Спасибо.

Сообщение отредактировал DO_SL - Mar 21 2011, 07:51
Go to the top of the page
 
+Quote Post
O.L.
сообщение Mar 21 2011, 08:49
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890



Цитата(DO_SL @ Mar 21 2011, 13:50) *
. Если у кого-то есть мысли по этому поводу, отпишитесь.
Спасибо.

Какое количество глобальных переменных, структур, буферов, инициализированных констант и строк в Вашей программе? Учитывая то, что RAM памяти у контроллера f36x много, были случаи, когда при выполнении инициализации всего этого "добра", до выполнения команд секции main успевал срабатывать WDT.
В этом случае, самое безопасное найти в коде файла STARTUP.A51 (лучше если он скопирован в директорию проекта) метку STARTUP1 и после нее вставить вот такую строчку.
Код
STARTUP1:
    IF IDATALEN <> 0
   ; Stop WDT
   ANL     0xD9,#0xBF        ; WDTE = 0 (clear watchdog timer // enable)

Если WDT нужен в основной программе, то в секции main перед началом инициализации периферии его включаем.

Прыжки "не ведомо куда" в отладчике Keil-а при разбиении проекта на несколько файлов, могут быть из-за неопределенности в отображении смешанного кода (листинг + ассемблер). В этом случае можно отслеживать ход выполнения команд по дизасемблеру. Хотя это не наглядно, а для большинства "программистО" незнакомых с ассемблером, просто катастрофа. Тогда можно, "наступив на горло правильной песне" sm.gif, свалить все в один сишный файл. Но я думаю, что лучше все же выучить ассемблер, чем потом поддерживать "километровый" код.
Go to the top of the page
 
+Quote Post
DO_SL
сообщение Mar 21 2011, 09:28
Сообщение #5





Группа: Участник
Сообщений: 14
Регистрация: 1-11-10
Из: Беларусь, Минск
Пользователь №: 60 563



Сброс по WDT наступает уже после инициализации регистров. Такой вот вариант не заработал.
CODE
STARTUP1:

;IF IDATALEN <> 0
; MOV R0,#IDATALEN - 1
; CLR A
;IDATALOOP: MOV @R0,A
; DJNZ R0,IDATALOOP
;ENDIF


А работать начало после удаления последней строки в STARTUP.A51
CODE
;LJMP ?C_START

Вот это-то меня и удивило. При этом main() начинает выполняться.

P.S. Чуть позже попробую Ваш вариант с отключением WDT сразу в STARTUP.a51. Спасибо за помощь.
Go to the top of the page
 
+Quote Post
O.L.
сообщение Mar 21 2011, 09:56
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890



Цитата(DO_SL @ Mar 21 2011, 15:28) *
Сброс по WDT наступает уже после инициализации регистров. Такой вот вариант не заработал.
Код
STARTUP1:
;IF IDATALEN <> 0
;                MOV     R0,#IDATALEN - 1
;                CLR     A
;IDATALOOP:      MOV     @R0,A
;                DJNZ    R0,IDATALOOP
;ENDIF

Без исходного кода трудно определить причину, но скорее всего из-за не инициализированных переменных подпрограммы выполняют что то не то.

Цитата(DO_SL @ Mar 21 2011, 15:28) *
А работать начало после удаления последней строки в STARTUP.A51
Код
;LJMP    ?C_START

Вот это-то меня и удивило. При этом main() начинает выполняться.

Если Вас в программе нет ни одного обработчика прерываний, то так и должно быть.
Go to the top of the page
 
+Quote Post
DO_SL
сообщение Mar 21 2011, 10:00
Сообщение #7





Группа: Участник
Сообщений: 14
Регистрация: 1-11-10
Из: Беларусь, Минск
Пользователь №: 60 563



Отключил WDT сразу в STARTUP. Все остальное вернул к оригинальному виду. Работает. Еще раз спасибо.
Go to the top of the page
 
+Quote Post
Halfback
сообщение Jun 30 2011, 05:09
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



У меня модуль RFM50 (от HopeRF), там чип Si4432
У тоже походу проблемы с запуском.
В файле startup.a51 добавил в метку STARTUP1 отключение ватчдога. Но всё равно не помогает.
Код
STARTUP1:

IF IDATALEN <> 0

           ANL     0xD9,#0xBF       ; WDTE = 0 (clear watchdog timer // enable)
                MOV     R0,#IDATALEN - 1
                CLR     A


В трассировшике смотрел, зацикливается на метке IDATALOOP
Код
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP

Комментрование строчки с отключением ватчдога не помогает!
Как с этим бороться? Помогите разобраться плиззз!
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 30 2011, 08:17
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Halfback @ Jun 30 2011, 09:09) *
У меня модуль RFM50 (от HopeRF), там чип Si4432...В файле startup.a51 добавил в метку STARTUP1 отключение ватчдога.
А, что? В Вашем МК управление WDT осуществляется так же, как и в C8051F361 ? Поскольку WDT отсутствовал в "классике", то его регистры и управление им в разных МК51 могут быть реализованы по-разному.
Go to the top of the page
 
+Quote Post
Harbinger
сообщение Jul 1 2011, 13:56
Сообщение #10


старший лаборант
******

Группа: Свой
Сообщений: 2 702
Регистрация: 30-09-05
Из: ЮЗЖД
Пользователь №: 9 097



Да RFM50 и SI1000 - вроде одно и то же. Соответственно, с WDT аналогичная ситуация.
В даташите на SI1000 есть загадочная фраза насчёт того, что WDT, мол, если не отключить, сработает вскоре после старта программы, без уточнения, когда конкретно - он что, даже положенного цикла не отработает? В F990 честно срабатывал через 30 с чем-то мс после аппаратного сброса - не такое уж и маленькое время для стартапа.


--------------------
Китайская комплектация - европейское качество! ;)
Go to the top of the page
 
+Quote Post
Halfback
сообщение Jul 4 2011, 04:42
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



Был в запаре. WDT отключил как писали выше.
Команду ;LJMP ?C_START комментировать не стал - в тело main() входит.

Сообщение отредактировал Halfback - Jul 4 2011, 07:57
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 00:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016