| Автор |
Съобщение |
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 10:32 pm Мнения: 710
|
 RQ: AVR GCC (или просто C?) - проблем с променлива в main()
В проекта, който пиша с ваша помощ  , ми се налага да ползвам променлива, глобална за цялата функция main().
Това е името на един файл, което генерирам веднага след ресет и ползвам през целия цикъл до изключването.
а) Ако променливата я дефинирам в секцията преди функцията main() всичко е наред (поне така изглежда  )
б) Ако дефиницията е непосредствено след заглавния ред на функцията - доста бързо стойността на променливата се разрушава.
Вероятно има някакъв проблем с стека, но не виждам къде би могъл да бъде ( например - да освобождава повече стек, отколкото заемам  , но системата не се рестартира, не забива, просто на конзолата виждам, че името на файла се скапва  ).
ето кратки фрагменти:
a) работи:
б) скапва се:
tFileName е декларирано в h файл:
typedef char tFileName[20];
|
| Вто Апр 05, 2011 8:47 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Не можеш ли да видиш на дебъгера какво става? Сложи watchpoint за write access към FileNameOfData, и би трябвало да спре в момента, когато почва да се пише в нея.
|
| Сря Апр 06, 2011 11:31 am |
|
 |
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 10:32 pm Мнения: 710
|
- Нямам развойна среда за реалната платка;
- В симулатора (Протеус) имам проблем с видимостта на сорса;
- В симулатора на AVR Studio (4 и 5) не мога да симулирам SD card;
Впрочем, май не съм пробвал - с AVR Studio 4 да задам протеус като среда за дебъг и да сложа watchpoint. (В AVR Studio 5 не мога да добавя Протеус като среда за дебъг).
Благодаря ! 
|
| Сря Апр 06, 2011 11:39 am |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
За static променливи чувал ли си? Ако не, земи прочети, чувам че си имал достатъчно книжки.
|
| Сря Апр 06, 2011 1:03 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
И как дефинирането и като статик ще помогне?
Нека даде мейн функцията и тогава да "гадаем".
|
| Сря Апр 06, 2011 1:33 pm |
|
 |
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 10:32 pm Мнения: 710
|
И на кое да обърна внимание на static променливите?
Ако тайно намекваш, че не се разполагат в стека  , моля поясни ми какъв е проблемът тая променлива да бъде ВЪВ стека?
|
| Сря Апр 06, 2011 1:33 pm |
|
 |
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 10:32 pm Мнения: 710
|
Много се извинявам, но не ми е ясно коя част от main() е важна  .
Извинявма се и на всички, които няма да харесат структурата на файла!
|
| Сря Апр 06, 2011 1:36 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
Страх ме е да попитам що си дефинирал 1 торба функции във функция мейн...
Нормално е локална променлива за функция мейн да не е достъпна от друга функция (въпреки че и тях си напъхал в мейн..).
решението е 1 - изкарваш я извън функция - т.е глобална.
|
| Сря Апр 06, 2011 1:41 pm |
|
 |
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 10:32 pm Мнения: 710
|
Мен повече ме е страх да отговоря  .
Защото тези функции се ползват само тук, а самите те ползват някои от глобалните променливи, които са декларирани в main.c.
Тия функции са все едно части от main(), но съм ги сложил отделно, за да е по-обозримо (поне за мен).
Едва ли това е най-лошото в организацията на проекта. Приемам всякакви критики с благодарност за отделеното време
(но тук ще постна малка картинка с един резултат, създаден от реална платка и прочетен от файла на SD Card)
|
| Сря Апр 06, 2011 1:49 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Аз дори не знаех, че може да се дефинира функция във функция...  Срам. Май само в питона съм срещал такова нещо. От толкова време пиша на С и все още научавам ново неща... Какво е предимството на този начин ? Ако има...
|
| Сря Апр 06, 2011 3:17 pm |
|
 |
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 10:32 pm Мнения: 710
|
Ами в Паскал е общоприет метод.
Ако една секция от алгоритъма се ползва няколко пъти в една и съща функциа и никъде другаде - това е начина да е четливо и ефективно.
В C# е голям зор  - ползва се Action 
|
| Сря Апр 06, 2011 4:49 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
Е, не знаех че в мейн е изтръскан целия код, че и вложени функции имало
Абе не е добра идея това с вложените функции... Ако се изцепя с нещо такова на работа, ще получа полагане в стил "Любо Ганев" 
|
| Сря Апр 06, 2011 5:52 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Наистина ли този компилатор ти позволява функция във функцията?
Странно на всичко което съм писал си вади надлежно съответната грешка при такъв опит.
|
| Сря Апр 06, 2011 6:25 pm |
|
 |
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 10:32 pm Мнения: 710
|
 Благодаря за разбирането  Не желая да бъда тълкуван погрешно (и пази боже някойд а помисли, че съм груб  ) - в C съм доста начинаещ, но винаги ме е дразнело, когато всички функции в юнита имат достъп до фумкция, която се ползва на 5 места само в една друга функция. Вярвам, няма нито един аргумент, че влагането на функции нарушава ефективността в която и да е посока. Това е нещо положително, подобно на инкапсулацията   При това GCC и в AvrStudio 4 и в AvrStudio 5 (с опция "-std=gnu99")
|
| Сря Апр 06, 2011 8:29 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
@NikB:
Малко офтопик, ама като си Паскаладжия, защо не си пишеш проекта на Паскал?
|
| Сря Апр 06, 2011 8:43 pm |
|
|