| Микроконтролери и електроника 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 ? ПС: (мое мнение) никога няма да ползвам такъв указател |
|
| Автор: | 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 байта. сигурно има и атрибути, с които можеш да дефинираш константа къде да е - в паметта или във флеш? но пак не мога да си представя, как компилатора се усеща и ти сменя инструкциите в зависимост от сочения обект та се обраничаваме само до 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 |
|
| Автор: | Nikola Kirov [ Сря Фев 08, 2006 12:37 am ] |
| Заглавие: | |
Отказах се вече да се боря с CW. Рекох да му помогна на човека с една библиотека да му напиша ама много главобол с компилатора. Пък маи и никой почти не работи с него че да даде акъл. |
|
| Автор: | ДедоБоре [ Сря Фев 08, 2006 12:42 am ] |
| Заглавие: | |
мен също не ме интересува CW то и 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/ |
|