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

Cross Works AVR въпросче
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=1759
Страница 1 от 2

Автор:  Nikola Kirov [ Вто Фев 07, 2006 3:35 pm ]
Заглавие:  Cross Works AVR въпросче

Помагам на един колега за един проект но нямам много опит с този компилатор и стигам до необходимоста от указател които да сочи към коя да е област от паметта RАМ или FLASH.

В IAR става лесно

char __generic *pTransmitBuff;

и pTransmitBuff е 3 баита големина и може да сочи и към рама и към флаша.
Как става това с Cross Works

Автор:  Реконструктор [ Вто Фев 07, 2006 4:16 pm ]
Заглавие: 

Ами не мисля, че можеш да пипаш програмната памет на общи основания. :?

Автор:  Nikola Kirov [ Вто Фев 07, 2006 4:44 pm ]
Заглавие: 

Ти с CW ли работиш?

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

Поне в IAR-a ако се пробваш да пишеш в масив които е в флаша или се терминира програмата или просто нищо не става. Не знам от какво зависи.

Но е много удобно да се ползват този тип универсални указатели,особенно в C++ ги ползвам често.

Въпроса как се правят такива указатели в CW

Автор:  Nikola Kirov [ Вто Фев 07, 2006 10:53 pm ]
Заглавие: 

Мамка му, никой ли не работи с CW?
Прегледах му доста обстоино документацията но не намерих и дума за подобни указатели.
Как стои въпроса с такива указатели в други компилатори?

Автор:  ДедоБоре [ Вто Фев 07, 2006 11:17 pm ]
Заглавие: 

?
в AVR си има инструкции за достъп до флаша LPM и SPM, при това активно ти трябва и Z-регистъра. освен това трябва да триеш по сектори флеша, преди да пишеш каквото и да е било в него. ако имаш и bootloadr, нещатата заприличват трътка на щтраус. няма начин да го напишеш елегантно с указател, във всеки случай. асемблер му е майкта, колкото и да ти е неприятно.

__generic май е IAR-специфично?
дали няма да стане нещо от рода (void *) ptr ?

ПС: (мое мнение) никога няма да ползвам такъв указател :wink:

Автор:  Nikola Kirov [ Вто Фев 07, 2006 11:28 pm ]
Заглавие: 

Искам да го ползвам само да чета. Нямам желание да пиша по този начин в флаша разбира се.
И тоя тип __generic указател е точно това което ми е най удобно за случая. В IAR ги ползвам често такива указатели.
В Hi-Tech другото дето познавам добре с сигурност няма такива указатели но там става въпрос за PIC все пак.
При АVR не е проблем да има такива указатели а CW не е чак толкова заспал компилатор и сигурно и тои има но въпроса е как се правят при него.
Или как са реализирани в други компилатори да пробвам дали не е така и в CW.

Няма как да стане с (void*) щото става дума за 2 различни адресни пространства.
По принцип това са extentions към C-to и е въпрос как са го измислили производителите на компилатора.

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

Автор:  ДедоБоре [ Вто Фев 07, 2006 11:51 pm ]
Заглавие: 

в AVR RAM-а и флеша са си отделно, в различни адресни пространства. и двете започват от нула. всички операции с уазатели се отнасят само към RAM. те са и с различна организация - 8 бита за RAM и 16 бита за флеш. слава богу, и двете са линейни - липсва уникалната концепция за странициране. EEPROM не го споменавам, защото той е през регистър.

ако ти трябва четене от флеш - трябва да ползваш LPM.
това с _generic, сигурно е някаква хватка на IAR, затова е 3 байта. сигурно има и атрибути, с които можеш да дефинираш константа къде да е - в паметта или във флеш? но пак не мога да си представя, как компилатора се усеща и ти сменя инструкциите в зависимост от сочения обект 8O

та се обраничаваме само до RAM. в повечето случаи той е 512 или 1024 байта, т.е. указателя е двубайтов. не знам дали можеш да го вкараш в регистър (дали ще мине register char (void *) ptr?), трябва да се гледа какво се асемблира. в този случай и обикновен указател върши работа: char * pTransmitBuff;

Автор:  Nikola Kirov [ Сря Фев 08, 2006 12:04 am ]
Заглавие: 

Значи в обработката на __generic указател се ползва някаква библиотека или е направо заложено в самия компилатор.

рекох да го направя с 2 функции w CW една за работа с масив в флаша една за работа с масив в рама но се оказа че не можах да разбера как да си направя указател към масив в флаша.
в IAR си е съвсем просто
char __flash *pArr;
Писна ми от тоя CW,колегата ще се оправя сам явно. Нямам нерви да се боря с това.

Автор:  ДедоБоре [ Сря Фев 08, 2006 12:28 am ]
Заглавие: 

в avr-gcc тези неща стават чрез __attribute__
CW има ли подобно нещо?

с този атрибут се оказва кое в коя секция се слага. a къде се намират секциите се описва в линкер-скрипта.
примерно: extern int a[] __attribute__(__progmem__);
после, като се обръщаш към a[], компилатора се усеща и си генерира LPM инструкция. но e само за константи и не става за запис. записа не е просто заменяне на LPM с SPM - има да се трият сектори преди това. и като се трия, трябва да се пази, това, което не се променя.
това май е еквивалентно на __flash

но не мога в момента да измисля как да се направи __generic :wink:

Автор:  Nikola Kirov [ Сря Фев 08, 2006 12:37 am ]
Заглавие: 

Отказах се вече да се боря с CW.
Рекох да му помогна на човека с една библиотека да му напиша ама много главобол с компилатора. Пък маи и никой почти не работи с него че да даде акъл.

Автор:  ДедоБоре [ Сря Фев 08, 2006 12:42 am ]
Заглавие: 

мен също не ме интересува CW :wink: но ако някой знае, ще е интересно да постне някоя мисъл - за архива.
то и IAR не ме интересува, по същата причина - $$$

Автор:  smollov [ Сря Фев 08, 2006 2:04 pm ]
Заглавие: 

От доста време се занимавам с това Rowley и когато ми се наложи да запиша масив във Flesh-a,
използвах следния код:

const __code char my_data[] = { // някакви данни задължително // };

и след това дефинирам указател към масива във flash-a

const __code char *data = my_data;


__code ->> указва че масивът е в flash-a

Автор:  Nikola Kirov [ Сря Фев 08, 2006 2:17 pm ]
Заглавие: 

smollov а такива универсални указатели за каквито говорих има ли?

Автор:  TheHungry [ Сря Фев 08, 2006 2:50 pm ]
Заглавие: 

В CodeVision za AVR e така:

typedef flash struct _DEVPROP {
unsigned char Name[15]; /* Device name */
} DEVPROP;

flash DEVPROP DevLst[] =
{
/* Name
{ "90S1200"}
};

flash DEVPROP *Device = NULL;

и после си работиш със Device като той сочи флаша

Автор:  Nikola Kirov [ Сря Фев 08, 2006 2:55 pm ]
Заглавие: 

И това е само за работа с флаш масив.
Явно че универсалните указатели са екстра само в IAR.

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