Отговори на тема  [ 5 мнения ] 
пак IAR и AVR 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение пак IAR и AVR
Искам да оформя една функция на прекъсване като отделен модул но така и не намерих пример за такова изпълнение.
Тази функция като резултат променя стоиноста на една променлива. Проблема ми идва като трябва тази променлива да е видима в main.
Пробвах всякакви варианти за инклудване на фаиллове с h и c фаилове но все някакъв проблем има.

Най накрая стигнах до решение което си работи,но ми се вижда много странно така да се решава по принцип такъв проблем.

значи декларирам си в c фаила където е въпросната функция

volatile __no_init char BUTTONVALUE @0xFF;

като слагам същата декларация и в main.c където се ползва и там и си я инициализирам в началото на main.

Абе и така си работи но ми е интересно как се прави по принцип.

Друг вариант е да си оформя функцията като обикновенна функция и да я добавя в някой модул а функцията на прекъсването да си е в основния файл и да я извиква. Но така пък се получава много голям и бавен код / скоро постнах asm листинг за функция от прекъсване която вика друга функция и там съхраняването и възтановяването на контекста е 64баита/


Съб Юни 04, 2005 1:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Не става ли така: в модула със ISR си дефинираш променливата, включваш файла в проекта, а във main я декларираш като extern. При мен си го правя така и почти нямам проблеми.


Съб Юни 04, 2005 1:49 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Ное 16, 2004 4:43 pm
Мнения: 85
Местоположение: София
Мнение 
Не съм ползвал IAR, но все пак си е C. По принцип става така:

file.c:
Код:
char name;
void func (char i) { // Примерна функция
  name = i;
}


file.h:
Код:
extern char name;
extern void func (char i);


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

int main (void) {
char c;
  func (25);
  c = name;  // трябва да  25
  return 0;
}


Съб Юни 04, 2005 2:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Да така става,достатъчно е както казва батето ама кой да мисли. :oops:

А нещо друго се получава. Тази функция имам декларирани 3 променливи.

#pragma vector=TIMER0_OVF_vect
__interrupt void Timer0_Overflow(void)
{
static char OLDBUTTON;
char BUTTON = 1;
char mask = 1;
---------------------------------
---------------------------------

Live Whatch при дебъгване не ми дава стоиностите им.
дава
Unknown or Ambigous Symbol за първата
Cant Take address за другите.

Което води до неудобство при дебъгването. Това е с JTAG-а като дебъгвам. Не съм пробвал в симулатора. Какъв му е проблема на IAR-a да има идея някой?


Съб Юни 04, 2005 2:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ами аз понеже непрекъснато имам променливи които са ми глобални за всички функции (вкл. прекъсванията) - правя така:
1. Правя си един фаил global.c дето си декларирам глобалните данни.
2. Един файл globals.h дето всичките глобални ги дефинирам пак ама като EXTERN.
3. После навсякъде (във всеки файл) дето трябва да имам достъп до глобалните променливи си включвам #include"globals.h"

И готово. Противно е на всякакви правила за обектно ориентирано програмиране, ама аз си падам по глобалните променливи. Пести памет, по бързо е, абе за контролер нямат алтернатива.

Да не говорим че за пик например си маам с влючен static по default. Само ако някъде хич не ми пука за скорост ползвам стекови променливи.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Съб Юни 04, 2005 2:49 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 5 мнения ] 

Кой е на линия

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


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

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