суббота, 8 сентября 2012 г.

Работа над ошибками

Сегодня поправил одну из мало примечательных ошибок в функции startup() для примеров stm32f4discovery.

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

Я взял стандартную инициализацию из примеров для стм:


 unsigned long *src;
    unsigned long *dest;
    
    src = &__text_end;
    dest = &__data_start;
    if (src != dest)
        while(dest < &__data_end)
            *(dest++) = *(src++);
 
    dest = &__bss_start;
    while(dest < &__bss_end)
        *(dest++) = 0;

После чего те примеры в которые я добавил этот код инициализации заработали как надо.
На этом все.