megaharon 0 14 декабря, 2010 Опубликовано 14 декабря, 2010 · Жалоба Здравствуйте. Застрял на том, что система не стартует, сваливается в HardFault, нужны подсказки что и где проверить. Среда разработки: WindowsXP + Eclipse + gcc (toolchain от klen), отладчика нет (кстати, посоветуйте, что взять для данной среды). Запускаю так: Скачал порт для stm32 (scmRTOS.3.10.cortexm3.gcc.rar), поправил скрипт линкера, поправил таблицу прерываний в startup, откомпилировал проект 1-EventFlag (управление светодиодами сделал свое). Запускаю - ОС делает настройку systick, PendSVC, доходит до PendSVC и затем HardFault. Вот. Сам не понимаю, чего я не понимаю, поэтому прошу помощи. Пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 15 декабря, 2010 Опубликовано 15 декабря, 2010 · Жалоба Так, телепатически, сложно сказать:) Выложите свой проект, посмотрим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megaharon 0 15 декабря, 2010 Опубликовано 15 декабря, 2010 · Жалоба Так, телепатически, сложно сказать:) Выложите свой проект, посмотрим. Проект прикреплен. Появились конкретные вопросы: В cortexm3 два стека - Process stack (PS) и main stack (MS). Какой стек в какой момент функционирования scmRTOS работает? Где (в каком месте программы) в системе осуществляется переключение между этими стеками? Где (физически) в памяти PS должен располагаться, в какую сторону расти? Прочитал user manual для lpc17xx и не понял, объясните пожалуйста, что делает и для чего вообще нужно прерывание PendSV? sp5_v0_lpc17test_export.zip Там для отладки в скрипте линкера добавлена константа _ustack -- это я пытаюсь разобраться со стартом системы, с инициализацией процессов. Указатели StackPointer всех трех процессов почему-то оказывались равными _estack и указывали на стек программы и при старте все падало, поэтому я перенес _estack в середину памяти, а программный стек назвал _ustack и записал его в начало таблицы векторов прерываний. После этого система (по-моему) успешно прошла нулевую инициализацию и теперь сваливается где-то в другом месте... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 15 декабря, 2010 Опубликовано 15 декабря, 2010 · Жалоба Похоже, что вы скачали старую версию. С тех пор кое-что поменялось в компиляторе, и, соответственно, в линкерном скрипте. Поменяйте __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 имеет наименьший приоритет. Ну а в прерывании происходит сохранение контекста текущей задачи (частично аппаратное), поиск задачи, на которую нужно переключиться, и восстановление контекста новой задачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megaharon 0 15 декабря, 2010 Опубликовано 15 декабря, 2010 · Жалоба Похоже, что вы скачали старую версию. С тех пор кое-что поменялось в компиляторе, и, соответственно, в линкерном скрипте. Поменяйте __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 (lpc1768, плата sk-mlpc1768, starterkit) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 16 января, 2011 Опубликовано 16 января, 2011 · Жалоба Что-то запамятовал - на кортексе м3 при заходе в прерывание на какой стёк сохраняется контекст? На стёк процесса или на мэйн? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 16 января, 2011 Опубликовано 16 января, 2011 · Жалоба На текущий :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 16 января, 2011 Опубликовано 16 января, 2011 · Жалоба На текущий :) Спасибо :) Значит, предусматривать место необходимо на всех стёках программы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 16 января, 2011 Опубликовано 16 января, 2011 · Жалоба Да, но только на один уровень, и только на автоматически сохраняемые регистры (xPSR, PC, LR, R12, R0-R3). Потому что при входе в прерывание происходит переключение на Main стек, и все дополнительные сохранения производятся уже на него. (Это для обычных прерываний, в прерывании для переключения контекста весь контекст сохраняется на стеке процесса) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 16 января, 2011 Опубликовано 16 января, 2011 · Жалоба То есть при переключении задач на стёк текущей задачи сохраняется 64 байта? зы: что то я раздул мэйн стёк, при двух уровнях приоритетов прерываний, думаю, 500 байт для него хватит сполна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 16 января, 2011 Опубликовано 16 января, 2011 · Жалоба Да, полный контекст, 64 байта. И да, Main стек обычно используется мало. Ну если только у вас в прерываниях нет локальных переменных на килобайты :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться