Отговори на тема  [ 22 мнения ]  Отиди на страница 1, 2  Следваща
XC8 достъп до статична променлива 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение XC8 достъп до статична променлива
Здравейте! От скоро минах на XC8 и т. н. Имам малък проблем със статични променливи! Имам дефинирана статична променлива(масив):
Код:
static uint8_t writeBuffer[CDC_DATA_IN_EP_SIZE];

Опитах да поставя тази дефиниция, както в .h, така и в .c! Проблемът е, че когато добавя нов файл (.h) под дефиницията не виждам буфера него.
Защо става така?
Мога лесно да се справя с някакъв допълнителен буфер, но не мисля това е редно...
Благодаря!

_________________
www.elkran.com


Пет Май 13, 2016 9:16 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 02, 2008 10:24 pm
Мнения: 105
Мнение Re: XC8 достъп до статична променлива
примерно това:

http://www.careerride.com/C-static-variables-scope.aspx


Пет Май 13, 2016 9:25 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: XC8 достъп до статична променлива
Махни тоз static че с него си правиш променливата видима само във файла в който си я дефинирал. На негово място сложи volatile и си готов.


Пет Май 13, 2016 9:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: XC8 достъп до статична променлива
Ясно! А volatile ще работи ли с putUSBUSART()?! Основният ми проблем е, че използвам USB CDC и до установих, че функциите му работят само със статични променливи(не че съм тествал с всички видове). Ще опитам с volatile, дано да работи така. Иначе от инфото по-горе става ясно, че статичните са видими само в текущия файл и ще трябва да оправя това по кофти начина - с допълнителен буфер и "преливане"!

_________________
www.elkran.com


Пет Май 13, 2016 10:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: XC8 достъп до статична променлива
Volatile не помага! Ще си го направя по баламския начин! Писна ми да се занимавам с това...

_________________
www.elkran.com


Съб Май 14, 2016 9:51 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: XC8 достъп до статична променлива
За пореден път: ако се експортва променлива в хедър, е задължително тя да бъде декларирана с extern отпред!
В .с файла:
Код:
uint8_t  writeBuffer[CDC_DATA_IN_EP_SIZE];

В .h файла:
Код:
extern uint8_t  writeBuffer[CDC_DATA_IN_EP_SIZE];


Съб Май 14, 2016 1:39 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11265
Местоположение: Добрич
Мнение Re: XC8 достъп до статична променлива
Абе не се карайте на детето, обяснето му ;-)

Стефчо, при Ц-то освен ако не пишеш нещо от сорта "hellow world" сорс кода рядко се събира в един единствен файл. То не че не можеш да наблъскаш всичко в един файл, ама може да стане голяма боза... Хубаво е да си групираш сорса в отделни файлчета по някаква прегледна логика.

Сега, номерът е че ако имаш повече файлчета, компилацията им е независима. Т.е. всеки си се компилира сам за себе си, независимо от останалите. Така всеки сорс файл се компилира до обектен файл. После има един процес нарече линкване, при който от обектните файлове се сглобява изпълним файл/hex/bin/elf или каквото там му кажеш.

Но да се върнем на сорса.... казахме, че той се компилира файл по файл, независимо един от друг. Какво става обаче ако код от един сорс файл ползва код или данни от друг сорс файл. Някак си компилаторът трябва да може да се ориентира дали кода/данните са локални или не. За целта се гледат няколко неща.
Първо имаш декларация и дефиниция. Декларациите са като обещанията... казваш на компилатора, че някъде ще има такова животно, ама къде ще е, не е ясно. Докато дефиницията буквално заковава това дето дефинираш на мястото дето го дефинираш. Демек един вид създаваш го това нещо.
Примерно:
Код:
void foo(void);    //-- декларация на функция
extern uint8_t data;   //-- декларация на променлива


Код:
void foo(void)    //-- дефиниция на функция
{
}

uint8_t data;   //-- дефиниция на променлива


Казахме, че говорим за много сорс файлове... За да може да ползваш в един сорс код/данни от друг ти трябват само декларациите. За удобство декларациите се пишат в h-файлове, докато дефинициите по принцип са в сорсовете. Не че е задължително, просто такава е практиката. Защо, ами защотото дефиницията ако се замисилиш малко ще се сетиш че трябва да е една. А пък декларациите трябва да ги имаш толкова пъти, колкото пъти ги ползваш в различни сорс файлове. Да ама тъпо да правиш copy&paste... много по-удобно е просто да вмъкнеш с #include декларациите на това дето ще ползваш.

Ако сложиш дефиниция в хедър и тоя хедърър го инклуднеш на 5 места все едно правиш 5 различни дефиниции. Ако това са променливи значи правиш 5 различни променливи. Дефакто ти може точно това да си искал, макар че често се случва и по погрешка. Затова повечето компилатори предупреждават, освен ако не сложиш "static" което значи че искаш storage class-а да е локален, демек казаш на компилатора че не си се объркал и искаш да работиш с локално дефинирана финкция/променлива. Дори и да има някъде другаде същата дефиниция със същото име не е проблем, ти си казал че работиш с локалната.

"volatile" пък означава, че въпросната променлива може да не е просто променлива, а хардуерен регистър или просто искаш да кажеш че операциите с това животно са важни (за теб) и компилаторът не трябва нито да ги оптимизира (маха) нито да ги разбърква във времето с други подобни.
Примерно ако имаш някакъв израз, обаче резултата не се използва, то компилатора може да реши да го "оптимизира". Ако обаче в израза имаш volatile, то те ще се четат независимо дали прочетеното после се ползва или не.


Съб Май 14, 2016 2:39 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: XC8 достъп до статична променлива
Миро, не поощрявай анти-програмиране с дефиниции на променливи в хедър. Той може и да иска, ама не трябва да иска :)


Съб Май 14, 2016 4:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11265
Местоположение: Добрич
Мнение Re: XC8 достъп до статична променлива
Аз да не съм му шеф та да му казвам как да си върши работата ;-)

Обеснявам кое как може пък после изборът си е негов....


Съб Май 14, 2016 4:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: XC8 достъп до статична променлива
Миро, благодаря за разяснението! Нямам много опит с XC компилаторите. Обикновено използвам CCS, а там се компилира целия проект и го няма това с многократното include на хедъри! Иначе съм наясно какво да слагам в .h и .c! Просто не бях наясно с видимостта на променливите в различните файлове! Когато нещо е static, очаквах да се вижда навсякъде ...
Иначе реших проблема :) Малко като първия човек, но поне работи...
Благодаря!

_________________
www.elkran.com


Съб Май 14, 2016 5:42 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение Re: XC8 достъп до статична променлива
miro_atc написа:
Абе не се карайте на детето, обяснето му ;-)

...

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

Това се избягва с условно компилиране.
Код:
#ifndef _ime_na_file
#define _ime_na_file
//тук идва твоя код
#endif

_________________
Хайде де!


Съб Май 14, 2016 6:12 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11265
Местоположение: Добрич
Мнение Re: XC8 достъп до статична променлива
dan написа:
Това се избягва с условно компилиране.
Код:
#ifndef _ime_na_file
#define _ime_na_file
//тук идва твоя код
#endif


Това дето казваш предпазва от многократно инклудване на един и същ хедър в един и същ compilation unit.

А аз обяснявах за инклудване на един хедър (съдържащ дефиниции) в няколко различни compilation unit-a.


Съб Май 14, 2016 6:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11265
Местоположение: Добрич
Мнение Re: XC8 достъп до статична променлива
stoyanoff написа:
Когато нещо е static, очаквах да се вижда навсякъде ...

тц, точно обратното е ;-)

Всъщност static не касае директно видимостта (scope), а къде се разполага нещото (storage class) но ефектът е същият...


Съб Май 14, 2016 6:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: XC8 достъп до статична променлива
miro_atc написа:
Всъщност static не касае директно видимостта (scope), а къде се разполага нещото (storage class)


Абсолютно! Но когато е заделена статична памет за дадена променлива и тя не се изменя(static), очаквах да се вижда навсякъде. Тук няма public, private, protected и ...
Както и да е! Има си особености и като не съм работил с това нЯщо...

_________________
www.elkran.com


Съб Май 14, 2016 7:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: XC8 достъп до статична променлива
Момци, нещо не правя, както трябва! Или поне аз си мисля така! До колкото разбрах трябва да си декларирам променливите с volatile в някой от файловете, след което ако искам да ги използвам в друг файл използвам extern. Програмата се компилира при това положение, обаче променливите нямат стойности - присвоявам стойност и като се опитам да я прочета няма нищо вътре!
Ето пример:
buffer.c:
Код:
volatile unsigned int incomeBuffer[BufferSize];//BufferSize defined in buffer.h

main.c:
Код:
extern unsigned int incomeBuffer[BufferSize];

Какво бъркам? Видимостта на променливите е направена много шашаво...

_________________
www.elkran.com


Чет Май 19, 2016 2:57 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 22 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 12 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни