Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с инициализация
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=3843
Страница 1 от 1

Автор:  HCL [ Пет Мар 09, 2007 10:55 pm ]
Заглавие:  Проблем с инициализация

Заглавието не е точно :oops: , но проблемьт изглежда приблизително така


main.c
Код:
#include "array.h"

void func(void);

void main(void)
{....
}

void func(void)
{ unsigned char i;
   
   for(i=0; i<N ; i++)
   array[i] <<= 1;
}



array.h
Код:
#define SIZE 3

unsigned int array[SIZE] = {1, 2, 3};



резултатьт е, че масивьт ми е пьлен с неопределени стойности. Лошото е, че понякога стойностите са такива каквито трябва. Това е единственото място кьдето чета или пиша в масива.
В действителност операциите са малко повече, но всички са в func(), като не прехвьрлям максималната стойност на unsigned int. Накрая редуцирах всичко до обикновенно шифтване, сьщата история. Какво пропускам? Компилаторьт е КЕИЛ, а µC-а 88C166. Сигурно питам голяма глупост, ама ....

Автор:  Nikola Kirov [ Съб Мар 10, 2007 12:01 am ]
Заглавие: 

Първо ми се набива на очи че си декларираш променлива и я инициализираш в h фаила. Това не е правилно.
Ако този h фаил го инклуднеш и някъде другаде по принцип компилатора трябва да даде грешка. Ако не даде резултатите може и да са като това което описваш.

трява да инициализираш в c. фаила а в h фаила да имаш

extern unsigned int array[]; ако искаш този масив да го ползваш и в някой друг c фаил в които си инклуднал h фаила.

Автор:  HCL [ Съб Мар 10, 2007 2:41 am ]
Заглавие: 

Никола благодаря за отговора! Забравих да пиша, че бях опитал да декларирам и едновременно с това да инициализирам най-горе в .c файла, още преди декларацията на всички функции.
После написах една функция modify(), която да го модифицира. Компилира се без проблеми обаче изглежда modify() не работи както трябва и func() дава глупости.


Код:
unsigned int array[3] = {1, 2, 3};

void func(void);
void modify(void);


void main(void)
{ modify();
   func();
}

void modify(void)
{ unsigned char i;
   
   for(i=0; i<N ; i++)
   array[i] <<= 1;
}


void func(void)
{ unsigned int x;
   x = array[0];
}


Нещата се оправят единствено когато декларирам и инициализирам масива вьтре в func() и си го модифицирам от там. Ще ровичкам отново в понеделник, изморен сьм и сигурно пропускам нещо.

Автор:  nickich [ Съб Мар 10, 2007 11:00 am ]
Заглавие: 

Като гледам така 'х' е локална за func(), което означава, че не се ползва другаде и компилатора може да оптимизира func(), или най-вероятно да я махне. Всъщност, какво трябва да прави func() в последния пример? Може да видиш листинга на програмата, или да спреш на brakepoint преди всяка функция и да видиш дали масива в началото е инициализиран правилно, или след това се омазва. Това не ми стана много ясно...

Автор:  HCL [ Съб Мар 10, 2007 11:48 am ]
Заглавие: 

@nickich

func() в действителност е модификация на binary search с която тьрся в lookup таблица, каква темп. сьм измерил (pt100). Това x сьм го писал за да изглежда по-пригледно.
Проблемьт дойде от там, че използвам делител на напрежение вместо източник на конст. ток (такова ми е заданиетоm знам че е сьпроводено и 1000 източника на грешки) и като начинаещ си сметнах lookup таблицата за даденото ми сьпротивление от 220ома. Което разбира се се оказа в долната граница на толерантността си и и се наложи да преизчисля lookup таблицата за 218ома. Обаче имах само крос компилатора на Кеил на разположение (и машината е под Windows) и викам за начало ще вкарам една modify() функция, която преизчислява наново lookup таблицата в µC-a.
В интерес на истината lookup таблицата си я преизчислявам в кьщи на PC-то и modify() в действителност не се мандахерца в сорса за µC-а, но да се появи тази грешка и искам да разбера защо. И за да ми е максимално гадно кода си стана големичьк и не мога да ползвам дебьгера (Кеила е демо), та опитвам да дебьгвам с LCD-то, мька. Ще огледам пак понеделник да не би да сьм пропуснал нещо.

Автор:  HCL [ Сря Мар 21, 2007 11:54 pm ]
Заглавие: 

Така мисля, че открих корените на проблема. Инициализацията на глобалните променливи е била забранена в startup файла, което в комбинация с изключено нулиране на RAM сектора ми е бьркало нещата. Тук е описано всичко по-подробно, ако представлява интерес за някой.
http://www.mcu-bg.com/mcu_site/viewtopi ... 7313#47313

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/