| Автор |
Съобщение |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
 KEIL C51 масив - поставяне на определено в CODE място ?
Имам един масив, да кажем Table, с предварително зададени стойности, искам да го поставя на определено във FLASH-а място. При други компилатори обикновено това се прави с ORG, в KEIL този директив важи само при ASM файловете. В Help-а има описана една ключова думичка _at_, която ми позволява да поставя променлива на определен адрес:
Проблема е, че не ми дава да инициализирам стойностите на масив:
Някой знае ли как се прави този трик ?
|
| Чет Фев 15, 2007 7:17 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Ами там в документацията си пише:
|
| Пет Фев 16, 2007 12:37 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Е това не е ли супер простотия ? 
|
| Пет Фев 16, 2007 1:02 am |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
Пробвай това:
Не дава грешка, но не съм сигурен, дали го слага на указания адрес.
|
| Пет Фев 16, 2007 1:13 am |
|
 |
|
Vilo
Ранг: Минаващ
Регистриран на: Пон Апр 03, 2006 9:00 am Мнения: 39
|
Keil-a няма ли нещо като #pragma директиви?
|
| Пет Фев 16, 2007 11:18 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Верно, компилира се, обаче KEIL компилатора пак хвърля масива в общия const space. Явно няма начин да стане това, ще мисля друга алтернатива
Edit: Има си прагма, опитвам с #pragma ASM/ENDASM да поставя масив писан на ASM, обаче компилатора си има някаква странна идея да не слуша в кой адрес искам да е даден сегмент, примерно:
Това прави кода ми от 16K CODE в 76К 
|
| Пет Фев 16, 2007 11:19 am |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Ами не съм много сигурен защо ти трябва да е на точно определено място.
Иначе да, отнесено към променливи, закотвени на определен адрес във флаша, липсата на инициализация малко обезсмисля целия процес.  Можеш да го направиш с някакъв инициализационен код и еднократна инициализация, нещо такова:
|
| Пет Фев 16, 2007 11:59 am |
|
 |
|
Noble
Ранг: Минаващ
Регистриран на: Вто Юли 18, 2006 12:53 pm Мнения: 22 Местоположение: Липщат
|
 Един груб подход
Един груб подход:
Отдели обекта в отделен файл (LOL.c)
иииииииииииии:
static const byte code GlobSWVersion = SW_VERSION;
Tab "LX51 Locate":
?CO?LOL(C:0x1FFF)
...
001FF5H 001FFEH 00000AH --- --- **GAP**
001FFFH 001FFFH 000001H BYTE UNIT CONST ?CO?LOL
|
| Пет Фев 16, 2007 12:01 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Това няма да работи, защото масива е във FLASH-a и писането по него става по малко по-различен начин (за Cygnal става въпрос), иначе съм си го мислил като вариант при първата инициализация да има такова писане (или някаква допълнителна програма с която да "калибрирам" устройството). Тая думичка _at_ ми се вижда леко безмислена, след като мога да дефинирам pointer, който да сочи към определен адрес във флаша:
Масива ми трябва да стои на определен във флаша блок (флаша е разделен на 128 блока по 512 байта), който да ползвам като EEPROM например (в тоя проц EEPROM няма) и простата идея е да подкарам устройството с някакви предварително зададени стойности в EEPROM-a.
@Noble, мерси за идеята, ще пробвам 
|
| Пет Фев 16, 2007 12:26 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Noble, имам да черпя, малко е "дървено" наистина, обаче работи 
|
| Пет Фев 16, 2007 12:38 pm |
|
 |
|
Noble
Ранг: Минаващ
Регистриран на: Вто Юли 18, 2006 12:53 pm Мнения: 22 Местоположение: Липщат
|
 :-)
И аз го изгледах на кестерме това като ми се наложи да го направя преди време ...
А дано някой излезе с елегантно предложение ...
|
| Пет Фев 16, 2007 12:41 pm |
|
 |
|
Vilo
Ранг: Минаващ
Регистриран на: Пон Апр 03, 2006 9:00 am Мнения: 39
|
 drugo reshenie
Another method of referencing explicit memory locations is to declare the variables in a stand-alone C module and use the linker location directives to locate them at an absolute memory address.
In the following example, the alarm_control structure is defined containing the variables to locate.
.
.
.
struct alarm_st {
unsigned int alarm_number;
unsigned char enable flag;
unsigned int time_delay;
unsigned char status;
};
xdata struct alarm_st alarm_control;
.
.
.
The C51 Compiler generates an object file for the above source (ALMCTRL.C) and includes a segment for variables in the xdata memory area. Since alarm_control is the only variable declared in this module, it is the only variable in the xdata segment. The name of the segment is ?XD?ALMCTRL.
The linker can locate a segment at any address. The following examples show how to locate the ?XD?ALMCTRL segment starting at offset 0x2000 in the xdata memory area.
For the BL51 Linker...
BL51 ... almctrl.obj XDATA(?XD?ALMCTRL(2000h)) ...
For the LX51 Linker...
LX51 ... almctrl.obj SEGMENTS(?XD?ALMCTRL(X:0x2000)) ...
You may also locate segments in the other memory areas like code, xdata, pdata, idata, and data
|
| Съб Фев 17, 2007 12:05 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
|
| Пон Фев 19, 2007 1:47 pm |
|
|