|
|
  |
Начало работы with scmRTOS, Несколько вопросиков |
|
|
|
Sep 13 2011, 09:44
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
А что понимается под конструкторами ? Функции вида: Код void Reset_Handler(void) { __Init_Data();
main(); } Есть подобное. Но сильно отличается. Да знак ! не заметил.
|
|
|
|
|
Sep 13 2011, 10:35
|

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

|
Цитата(a9d @ Sep 13 2011, 15:44)  А что понимается под конструкторами ? Конструкторы - это конструкторы. Функции инициализации объектов. Короче, без их вызова работать не будет. Вызываются как раз в __Init_Data(): Код /* Call constructors */ unsigned long *ctors; for(ctors = &__ctors_start__; ctors < &__ctors_end__; ) ((void(*)(void))(*ctors++))(); Цитата(a9d @ Sep 13 2011, 15:44)  Есть подобное. Но сильно отличается.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 13 2011, 10:38
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Такого нет. Но как я понимаю конструкторы нужны С++. Либы от стм все на си. Определил виновника Код #pragma weak HardFault_Handler = Default_Handler1 Объявил обработчика Код OS_INTERRUPT void HardFault_Handler(void){ for (;;); } И начал попадать в него. Теперь осталось определить что это и почему срабатывает.
Сообщение отредактировал a9d - Sep 13 2011, 11:10
|
|
|
|
|
Sep 13 2011, 15:18
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Исходя из того какое прерывание вызывается можно понят, что косяк с выделением памяти под стек. Это я нагуглил. На форумах пишут, что HardFault_Handler происходит при некорректном выделении памяти, обычно под стек или кучу. Сравнил ваш и стм конфиг. Они отличаются строкой Код /* Entry Point */ ENTRY(Reset_Handler) Добавил ее в ваш и все заработало.
|
|
|
|
|
Nov 8 2012, 02:54
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Вопрос не совсем по теме. Сейчас вожусь с портированием scmRTOS на CC2510 (ядро 8051). Кмпилятор IAR, используется программный стек. Я знаю адрес (0x11 0x10) где хранится указатель на шапку стека. Т.е. регистр SPX (хотя во время отладки он называется XSP). Этот адрес строго фиксированный ? Т.е. во всех версиях он одинаковый. Как я понял адрес определяется R0..R7 * Колличество банков + V0..V7 В документации Цитата XSP Description Holds the stack pointers to the xdata stack. Segment memory type DATA Memory placement 0–0x7F Access type Read/write Цитата -Z(DATA)XSP=08-7F Почему в порте для AVR размер для стеков typedef uint8_t stack_item_ ? Это каждый стек не может превышать 255 байт?
Сообщение отредактировал a9d - Nov 8 2012, 11:05
|
|
|
|
|
Nov 9 2012, 00:46
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Распетлял. Ох там все и закручено. Код #pragma segment="XSP" #define ABS_WORD() (*((__data volatile unsigned int*)(unsigned int)(__segment_begin("XSP")))) int s = ABS_WORD();
Сообщение отредактировал a9d - Nov 9 2012, 03:07
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|