| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| KEIL C51 масив - поставяне на определено в CODE място ? http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=3729 |
Страница 1 от 1 |
| Автор: | Predator_MF [ Чет Фев 15, 2007 7:17 pm ] | ||||||||||||||||||
| Заглавие: | KEIL C51 масив - поставяне на определено в CODE място ? | ||||||||||||||||||
Имам един масив, да кажем Table, с предварително зададени стойности, искам да го поставя на определено във FLASH-а място. При други компилатори обикновено това се прави с ORG, в KEIL този директив важи само при ASM файловете. В Help-а има описана една ключова думичка _at_, която ми позволява да поставя променлива на определен адрес:
Проблема е, че не ми дава да инициализирам стойностите на масив:
Някой знае ли как се прави този трик ? |
|||||||||||||||||||
| Автор: | Реконструктор [ Пет Фев 16, 2007 12:37 am ] | |||||||||
| Заглавие: | ||||||||||
Ами там в документацията си пише:
|
||||||||||
| Автор: | Predator_MF [ Пет Фев 16, 2007 1:02 am ] |
| Заглавие: | |
Е това не е ли супер простотия ? |
|
| Автор: | Gogo [ Пет Фев 16, 2007 1:13 am ] | |||||||||
| Заглавие: | ||||||||||
Пробвай това:
Не дава грешка, но не съм сигурен, дали го слага на указания адрес. |
||||||||||
| Автор: | Vilo [ Пет Фев 16, 2007 11:18 am ] |
| Заглавие: | |
Keil-a няма ли нещо като #pragma директиви? |
|
| Автор: | Predator_MF [ Пет Фев 16, 2007 11:19 am ] | |||||||||
| Заглавие: | ||||||||||
Верно, компилира се, обаче KEIL компилатора пак хвърля масива в общия const space. Явно няма начин да стане това, ще мисля друга алтернатива Edit: Има си прагма, опитвам с #pragma ASM/ENDASM да поставя масив писан на ASM, обаче компилатора си има някаква странна идея да не слуша в кой адрес искам да е даден сегмент, примерно:
Това прави кода ми от 16K CODE в 76К |
||||||||||
| Автор: | Реконструктор [ Пет Фев 16, 2007 11:59 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Ами не съм много сигурен защо ти трябва да е на точно определено място. Иначе да, отнесено към променливи, закотвени на определен адрес във флаша, липсата на инициализация малко обезсмисля целия процес.
|
|||||||||||||||||||
| Автор: | Noble [ Пет Фев 16, 2007 12:01 pm ] |
| Заглавие: | Един груб подход |
Един груб подход: Отдели обекта в отделен файл (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 |
|
| Автор: | Predator_MF [ Пет Фев 16, 2007 12:26 pm ] | |||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||
Това няма да работи, защото масива е във FLASH-a и писането по него става по малко по-различен начин (за Cygnal става въпрос), иначе съм си го мислил като вариант при първата инициализация да има такова писане (или някаква допълнителна програма с която да "калибрирам" устройството). Тая думичка _at_ ми се вижда леко безмислена, след като мога да дефинирам pointer, който да сочи към определен адрес във флаша:
Масива ми трябва да стои на определен във флаша блок (флаша е разделен на 128 блока по 512 байта), който да ползвам като EEPROM например (в тоя проц EEPROM няма) и простата идея е да подкарам устройството с някакви предварително зададени стойности в EEPROM-a. @Noble, мерси за идеята, ще пробвам |
||||||||||||||||||||||||||||
| Автор: | Predator_MF [ Пет Фев 16, 2007 12:38 pm ] |
| Заглавие: | |
Noble, имам да черпя, малко е "дървено" наистина, обаче работи |
|
| Автор: | Noble [ Пет Фев 16, 2007 12:41 pm ] |
| Заглавие: | :-) |
И аз го изгледах на кестерме това като ми се наложи да го направя преди време ... А дано някой излезе с елегантно предложение ... |
|
| Автор: | Vilo [ Съб Фев 17, 2007 12:05 pm ] |
| Заглавие: | 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 |
|
| Автор: | setoy [ Пон Фев 19, 2007 1:47 pm ] |
| Заглавие: | |
http://onembedding.com/tools/keil/artic ... icit_addr/ |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|