Перейти к содержанию
    

А что понимается под конструкторами ? Функции вида:

void Reset_Handler(void)
{
    __Init_Data();

    main();
}

Есть подобное. Но сильно отличается.

 

Да знак ! не заметил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что понимается под конструкторами ?

Конструкторы - это конструкторы. Функции инициализации объектов.

Короче, без их вызова работать не будет.

Вызываются как раз в __Init_Data():

    /* Call constructors */
    unsigned long *ctors;
    for(ctors = &__ctors_start__; ctors < &__ctors_end__; )
        ((void(*)(void))(*ctors++))();

Есть подобное. Но сильно отличается.

:biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такого нет. Но как я понимаю конструкторы нужны С++. Либы от стм все на си.

 

Определил виновника

 

#pragma weak HardFault_Handler = Default_Handler1

 

Объявил обработчика

OS_INTERRUPT void HardFault_Handler(void){
    for (;;);
}

 

И начал попадать в него. Теперь осталось определить что это и почему срабатывает.

Изменено пользователем a9d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но как я понимаю конструкторы нужны С++. Либы от стм все на си.
А ОС на плюсах. И пока не будут вызываться конструкторы - ОСь работать не будет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все нашел косяк. У вас STM32F10X_MD_VL.ld не правильный. Возможно и другие тоже.

 

Использовал конфиг от stm. Немного подправил и отладка заработала. ОС тоже работает. Но это покачто сделал на скорую руку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все нашел косяк. У вас STM32F10X_MD_VL.ld не правильный. Возможно и другие тоже.

А поконкретнее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Исходя из того какое прерывание вызывается можно понят, что косяк с выделением памяти под стек.

Это я нагуглил. На форумах пишут, что HardFault_Handler происходит при некорректном выделении памяти, обычно под стек или кучу.

 

Сравнил ваш и стм конфиг. Они отличаются строкой

/* Entry Point */
ENTRY(Reset_Handler)

 

Добавил ее в ваш и все заработало.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гм. Очень странно... Давайте уточним пару моментов.

1. Программа без этого работает, но при отладке виснет?

2. Какой у вас компилятор?

3. При чём здесь "косяк с выделением памяти под стек"? :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Да, работает. Но при отладке улетает в прерывание. Если его не объявить, то вешается. Если объявить, то отладка работать будет но смотрится как-то не кошерно такой вариант.

2) Sourcery G++ Lite самый последний.

3) Это на этом форуме нагуглил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раз программа работает, то дело естественно не в "косяке с выделением памяти". Думаю, что отладчик без этой строчки как-то не так понимает elf-файл, и загоняет процессор куда-то не туда.

Спасибо вам за найденный косяк. Надо будет исправить...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знал куда запостить свой вопрос и запостил в соседнюю тему: http://electronix.ru/forum/index.php?showt...t&p=1098216

Буду очень благодарен, если кто ответит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос не совсем по теме.

 

Сейчас вожусь с портированием 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

stak_item_t -- тип хранящихся в стеке даных (его гранулярность). А не размер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно я понимаю, что освоив данную ось, проблем с переходом от одного проца к другому нет вообще? Т.е. я не изучаю досконально работу процессора, а просто пишу код. Использую прерывания, работу с периферией и прочее, но описываю их правилами оси?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Распетлял. Ох там все и закручено.

 

#pragma segment="XSP"
    #define  ABS_WORD()  (*((__data volatile unsigned int*)(unsigned int)(__segment_begin("XSP"))))
    int s  = ABS_WORD();

 

Изменено пользователем a9d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...