Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: есть вопрос, может кто с таким сталкивался
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Berny
Есть код, но причина в его куске, причина следующая, прогоняю его в симуляторе avrstudio 4, отдельно написал програмку тестить только его, слетает на 0 и в основной и в тестовой, только в тестовой проходов больше.

i=list_left_x;
nline0=0;
while(i<(list_left_x+80))
{
tmp&=nlineb;
wr_to_tmp(tmp,0x02,i>>1);
nlineb>>=1;
if(nlineb==0)
{
nlineb=0x80;
nline0++;
tmp=fonts_8x8[(list_left[nline0]<<3)+nline1];
}
i++;
}

код писался под iar, но аналогичный есть и под gcc, fonts_8x8 и list_left во флеше, функция только формирует буфер
после 2-3х проходов симулятор делает сброс, память проверял, стек тоже, переполнения нет, вдт включен но сбрасывается как надо,
пробовал и отключать, прерывание только по таймеру.
если кто сталкивался с таким помогите)
Палыч
Цитата(Berny @ Aug 4 2011, 12:34) *
...слетает на 0 ...
Такое случается, если разрешено какое-либо прерывание, а функции(процедуры) обработки этого прерывания - нет.
Berny
специально расписал) только 2 прерывания, других нет и по битам нет, и написал, что пробовал запрещать, тоже самое
еще одно, если ставить оптимизацию, то проходов больше, вот что не понятно
one_eight_seven
Если в теле программы встречается функция, которой нет, выполнение программы начинается с нулевого адреса
Палыч
Цитата(Berny @ Aug 4 2011, 13:42) *
если ставить оптимизацию, то проходов больше, вот что не понятно
Вполне логично: оптимизированный код выполняется быстрее; если дело, например, в прерываниях от таймера, то между прерываниями - выполнится больший кусочек программы.
У Вас "слёт" программы - всегда в приведенном вами участке программы? Поставьте перед ним запрет прерываний, а после него - разрешение. Посмотрите: всегда ли будет выполнятся этот кусочек программы до конца при запрешенных прерываниях?
xemul
Цитата(Berny @ Aug 4 2011, 12:34) *
вдт включен но сбрасывается как надо

Цитата(Berny @ Aug 4 2011, 13:42) *
если ставить оптимизацию, то проходов больше

запретите WDT
или добавьте его сброс перед while(i<(list_left_x+80)) {...}
или лампочкой на него помигайте
или измерьте время выполнения while(i<(list_left_x+80)) {...}
или ...

ЗЫЖ в следующий раз, когда будете расписывать, постарайтесь придумать осмысленное название темы и научиться пользоваться тэгами code /code.
Berny
проще asm("cli");
повторяю пробовал, дизасемблером слетает на call'е, я 10 лет контроллеры програмлю, что я такие вещи не знаю
а вот с симулятором в данном случае проблема возникла, тут не в прерываниях дело
Палыч
Цитата(one_eight_seven @ Aug 4 2011, 13:49) *
Если в теле программы встречается функция, которой нет, выполнение программы начинается с нулевого адреса
Линкер при этом обязан выдать ошибку! Вряд ли ТС её не замечает...
Berny
еще хуже упростил до безумия
Код
int main(void)
{
   unsigned int i=0;
   unsigned char tmp=0;
   asm("cli")
   while(1)
   {
       i=0;
       while(i<640)
       {
           tmp=pgm_read_byte(%fonts_8x8[0]);
           i++;
       }
    }
}

слетает после 9го прохода

тема закрыта, так и не понял из-за чего, но после перезагрузке компа норм проходит
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.