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

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Cross Works AVR въпросче
Помагам на един колега за един проект но нямам много опит с този компилатор и стигам до необходимоста от указател които да сочи към коя да е област от паметта RАМ или FLASH.

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

char __generic *pTransmitBuff;

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


Вто Фев 07, 2006 3:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Ами не мисля, че можеш да пипаш програмната памет на общи основания. :?


Вто Фев 07, 2006 4:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Ти с CW ли работиш?

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

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

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

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


Вто Фев 07, 2006 4:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Мамка му, никой ли не работи с CW?
Прегледах му доста обстоино документацията но не намерих и дума за подобни указатели.
Как стои въпроса с такива указатели в други компилатори?


Вто Фев 07, 2006 10:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
?
в AVR си има инструкции за достъп до флаша LPM и SPM, при това активно ти трябва и Z-регистъра. освен това трябва да триеш по сектори флеша, преди да пишеш каквото и да е било в него. ако имаш и bootloadr, нещатата заприличват трътка на щтраус. няма начин да го напишеш елегантно с указател, във всеки случай. асемблер му е майкта, колкото и да ти е неприятно.

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

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


Вто Фев 07, 2006 11:17 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Искам да го ползвам само да чета. Нямам желание да пиша по този начин в флаша разбира се.
И тоя тип __generic указател е точно това което ми е най удобно за случая. В IAR ги ползвам често такива указатели.
В Hi-Tech другото дето познавам добре с сигурност няма такива указатели но там става въпрос за PIC все пак.
При АVR не е проблем да има такива указатели а CW не е чак толкова заспал компилатор и сигурно и тои има но въпроса е как се правят при него.
Или как са реализирани в други компилатори да пробвам дали не е така и в CW.

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

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


Вто Фев 07, 2006 11:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
в AVR RAM-а и флеша са си отделно, в различни адресни пространства. и двете започват от нула. всички операции с уазатели се отнасят само към RAM. те са и с различна организация - 8 бита за RAM и 16 бита за флеш. слава богу, и двете са линейни - липсва уникалната концепция за странициране. EEPROM не го споменавам, защото той е през регистър.

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

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


Вто Фев 07, 2006 11:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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

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


Сря Фев 08, 2006 12:04 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
в avr-gcc тези неща стават чрез __attribute__
CW има ли подобно нещо?

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

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


Сря Фев 08, 2006 12:28 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Сря Фев 08, 2006 12:37 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
мен също не ме интересува CW :wink: но ако някой знае, ще е интересно да постне някоя мисъл - за архива.
то и IAR не ме интересува, по същата причина - $$$


Сря Фев 08, 2006 12:42 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Ное 10, 2004 3:20 pm
Мнения: 19
Мнение 
От доста време се занимавам с това Rowley и когато ми се наложи да запиша масив във Flesh-a,
използвах следния код:

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

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

const __code char *data = my_data;


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


Сря Фев 08, 2006 2:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
smollov а такива универсални указатели за каквито говорих има ли?


Сря Фев 08, 2006 2:17 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 03, 2005 11:31 am
Мнения: 766
Местоположение: Пловдив
Мнение 
В 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 като той сочи флаша


Сря Фев 08, 2006 2:50 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
И това е само за работа с флаш масив.
Явно че универсалните указатели са екстра само в IAR.


Сря Фев 08, 2006 2:55 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 19 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

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


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

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