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

 
 
 
Reply to this topicStart new topic
> Запускаю scmRTOS на lpc1768 (cortex M3). Помогите.
Alekseeey
сообщение Dec 14 2010, 04:26
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626



Здравствуйте.

Застрял на том, что система не стартует, сваливается в HardFault, нужны подсказки что и где проверить.

Среда разработки: WindowsXP + Eclipse + gcc (toolchain от klen), отладчика нет (кстати, посоветуйте, что взять для данной среды).
Запускаю так: Скачал порт для stm32 (scmRTOS.3.10.cortexm3.gcc.rar), поправил скрипт линкера, поправил таблицу прерываний в startup, откомпилировал проект 1-EventFlag (управление светодиодами сделал свое).
Запускаю - ОС делает настройку systick, PendSVC, доходит до PendSVC и затем HardFault.

Вот. Сам не понимаю, чего я не понимаю, поэтому прошу помощи. Пожалуйста.

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 15 2010, 03:30
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Так, телепатически, сложно сказатьsm.gif
Выложите свой проект, посмотрим.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Alekseeey
сообщение Dec 15 2010, 08:30
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626



Цитата(AHTOXA @ Dec 15 2010, 09:30) *
Так, телепатически, сложно сказатьsm.gif
Выложите свой проект, посмотрим.


Проект прикреплен.

Появились конкретные вопросы:
В cortexm3 два стека - Process stack (PS) и main stack (MS). Какой стек в какой момент функционирования scmRTOS работает? Где (в каком месте программы) в системе осуществляется переключение между этими стеками?
Где (физически) в памяти PS должен располагаться, в какую сторону расти?
Прочитал user manual для lpc17xx и не понял, объясните пожалуйста, что делает и для чего вообще нужно прерывание PendSV?


Прикрепленный файл  sp5_v0_lpc17test_export.zip ( 348.3 килобайт ) Кол-во скачиваний: 143



Там для отладки в скрипте линкера добавлена константа _ustack -- это я пытаюсь разобраться со стартом системы, с инициализацией процессов. Указатели StackPointer всех трех процессов почему-то оказывались равными _estack и указывали на стек программы и при старте все падало, поэтому я перенес _estack в середину памяти, а программный стек назвал _ustack и записал его в начало таблицы векторов прерываний. После этого система (по-моему) успешно прошла нулевую инициализацию и теперь сваливается где-то в другом месте...

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 15 2010, 09:30
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Похоже, что вы скачали старую версию. С тех пор кое-что поменялось в компиляторе, и, соответственно, в линкерном скрипте.
Поменяйте
Код
        __ctors_start__ = .;
        KEEP(SORT(*)(.ctors))
        __ctors_end__ = .;

на
Код
    __ctors_start__ = .;
    KEEP(SORT(*)(.init_array))  /* eabi uses .init_array for static constructor lists */
    __ctors_end__ = .;


По вопросам.
Стеки. В прерываниях используется Main stack. Это как раз тот, вершину которого мы заносим в таблицу векторов. А в задачах используется Process stack.
PendSV используется для переключения контекста. Когда выясняется, что нужно переключить контекст, задача взводит флажок прерывания PendSV. Если это происходит в прерывании, то перключение откладывается до окончания прерывания (или всех прерываний, если были вложенные). Это происходит потому, что прерывание PendSV имеет наименьший приоритет.
Ну а в прерывании происходит сохранение контекста текущей задачи (частично аппаратное), поиск задачи, на которую нужно переключиться, и восстановление контекста новой задачи.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Alekseeey
сообщение Dec 15 2010, 11:22
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626



Цитата(AHTOXA @ Dec 15 2010, 15:30) *
Похоже, что вы скачали старую версию. С тех пор кое-что поменялось в компиляторе, и, соответственно, в линкерном скрипте.
Поменяйте
Код
        __ctors_start__ = .;
        KEEP(SORT(*)(.ctors))
        __ctors_end__ = .;

на
Код
    __ctors_start__ = .;
    KEEP(SORT(*)(.init_array))  /* eabi uses .init_array for static constructor lists */
    __ctors_end__ = .;


По вопросам.
Стеки. В прерываниях используется Main stack. Это как раз тот, вершину которого мы заносим в таблицу векторов. А в задачах используется Process stack.
PendSV используется для переключения контекста. Когда выясняется, что нужно переключить контекст, задача взводит флажок прерывания PendSV. Если это происходит в прерывании, то перключение откладывается до окончания прерывания (или всех прерываний, если были вложенные). Это происходит потому, что прерывание PendSV имеет наименьший приоритет.
Ну а в прерывании происходит сохранение контекста текущей задачи (частично аппаратное), поиск задачи, на которую нужно переключиться, и восстановление контекста новой задачи.



После исправления файла скрипта линкера все заработало.

Огромное спасибо вам за помощь, AHTOXA.


Пожалуй, выложу здесь рабочий проект для примера, может не я один такой страдающий.

Прикрепленный файл  sp5_v0_lpc17test_export_work.zip ( 338.92 килобайт ) Кол-во скачиваний: 182
(lpc1768, плата sk-mlpc1768, starterkit)

Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 16 2011, 06:34
Сообщение #6


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Что-то запамятовал - на кортексе м3 при заходе в прерывание на какой стёк сохраняется контекст?
На стёк процесса или на мэйн?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 16 2011, 07:10
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



На текущий sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 16 2011, 09:29
Сообщение #8


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(AHTOXA @ Jan 16 2011, 13:10) *
На текущий sm.gif

Спасибо sm.gif

Значит, предусматривать место необходимо на всех стёках программы...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 16 2011, 09:39
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да, но только на один уровень, и только на автоматически сохраняемые регистры (xPSR, PC, LR, R12, R0-R3).
Потому что при входе в прерывание происходит переключение на Main стек, и все дополнительные сохранения производятся уже на него.
(Это для обычных прерываний, в прерывании для переключения контекста весь контекст сохраняется на стеке процесса)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 16 2011, 09:50
Сообщение #10


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



То есть при переключении задач на стёк текущей задачи сохраняется 64 байта?

зы: что то я раздул мэйн стёк, при двух уровнях приоритетов прерываний, думаю, 500 байт для него хватит сполна.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 16 2011, 09:59
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да, полный контекст, 64 байта.
И да, Main стек обычно используется мало. Ну если только у вас в прерываниях нет локальных переменных на килобайты sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 9th July 2025 - 13:03
Рейтинг@Mail.ru


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