a9d 0 13 сентября, 2011 Опубликовано 13 сентября, 2011 · Жалоба А что понимается под конструкторами ? Функции вида: void Reset_Handler(void) { __Init_Data(); main(); } Есть подобное. Но сильно отличается. Да знак ! не заметил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 13 сентября, 2011 Опубликовано 13 сентября, 2011 · Жалоба А что понимается под конструкторами ? Конструкторы - это конструкторы. Функции инициализации объектов. Короче, без их вызова работать не будет. Вызываются как раз в __Init_Data(): /* Call constructors */ unsigned long *ctors; for(ctors = &__ctors_start__; ctors < &__ctors_end__; ) ((void(*)(void))(*ctors++))(); Есть подобное. Но сильно отличается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 13 сентября, 2011 Опубликовано 13 сентября, 2011 (изменено) · Жалоба Такого нет. Но как я понимаю конструкторы нужны С++. Либы от стм все на си. Определил виновника #pragma weak HardFault_Handler = Default_Handler1 Объявил обработчика OS_INTERRUPT void HardFault_Handler(void){ for (;;); } И начал попадать в него. Теперь осталось определить что это и почему срабатывает. Изменено 13 сентября, 2011 пользователем a9d Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 13 сентября, 2011 Опубликовано 13 сентября, 2011 · Жалоба Но как я понимаю конструкторы нужны С++. Либы от стм все на си.А ОС на плюсах. И пока не будут вызываться конструкторы - ОСь работать не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 13 сентября, 2011 Опубликовано 13 сентября, 2011 · Жалоба Все нашел косяк. У вас STM32F10X_MD_VL.ld не правильный. Возможно и другие тоже. Использовал конфиг от stm. Немного подправил и отладка заработала. ОС тоже работает. Но это покачто сделал на скорую руку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 13 сентября, 2011 Опубликовано 13 сентября, 2011 · Жалоба Все нашел косяк. У вас STM32F10X_MD_VL.ld не правильный. Возможно и другие тоже. А поконкретнее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 13 сентября, 2011 Опубликовано 13 сентября, 2011 · Жалоба Исходя из того какое прерывание вызывается можно понят, что косяк с выделением памяти под стек. Это я нагуглил. На форумах пишут, что HardFault_Handler происходит при некорректном выделении памяти, обычно под стек или кучу. Сравнил ваш и стм конфиг. Они отличаются строкой /* Entry Point */ ENTRY(Reset_Handler) Добавил ее в ваш и все заработало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 13 сентября, 2011 Опубликовано 13 сентября, 2011 · Жалоба Гм. Очень странно... Давайте уточним пару моментов. 1. Программа без этого работает, но при отладке виснет? 2. Какой у вас компилятор? 3. При чём здесь "косяк с выделением памяти под стек"? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 13 сентября, 2011 Опубликовано 13 сентября, 2011 · Жалоба 1) Да, работает. Но при отладке улетает в прерывание. Если его не объявить, то вешается. Если объявить, то отладка работать будет но смотрится как-то не кошерно такой вариант. 2) Sourcery G++ Lite самый последний. 3) Это на этом форуме нагуглил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 13 сентября, 2011 Опубликовано 13 сентября, 2011 · Жалоба Раз программа работает, то дело естественно не в "косяке с выделением памяти". Думаю, что отладчик без этой строчки как-то не так понимает elf-файл, и загоняет процессор куда-то не туда. Спасибо вам за найденный косяк. Надо будет исправить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба Не знал куда запостить свой вопрос и запостил в соседнюю тему: http://electronix.ru/forum/index.php?showt...t&p=1098216 Буду очень благодарен, если кто ответит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 8 ноября, 2012 Опубликовано 8 ноября, 2012 (изменено) · Жалоба Вопрос не совсем по теме. Сейчас вожусь с портированием 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 байт? Изменено 8 ноября, 2012 пользователем a9d Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 8 ноября, 2012 Опубликовано 8 ноября, 2012 · Жалоба stak_item_t -- тип хранящихся в стеке даных (его гранулярность). А не размер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 8 ноября, 2012 Опубликовано 8 ноября, 2012 · Жалоба Правильно я понимаю, что освоив данную ось, проблем с переходом от одного проца к другому нет вообще? Т.е. я не изучаю досконально работу процессора, а просто пишу код. Использую прерывания, работу с периферией и прочее, но описываю их правилами оси? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 9 ноября, 2012 Опубликовано 9 ноября, 2012 (изменено) · Жалоба Распетлял. Ох там все и закручено. #pragma segment="XSP" #define ABS_WORD() (*((__data volatile unsigned int*)(unsigned int)(__segment_begin("XSP")))) int s = ABS_WORD(); Изменено 9 ноября, 2012 пользователем a9d Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться