|
как разместить подпрограмму по заданному адресу |
|
|
|
 |
Ответов
|
Jul 25 2011, 10:54
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Цитата(MrYuran @ Jul 25 2011, 11:31)  Почитайте про секции. В GCC это будет __attribute__ ((section = "")), в IAR - #pragma location (емнип) или section (давно в руки не брал, забыл уже).
А для чего, если не секрет? Недавно тоже пробовали для неких целей. Поясню. Возможно, придётся реализовывать перепрошивку блока по GPRS. Хотелось бы часть программ положить в отдельные сектора и не трогать ни при каких обстоятельствах (продпрограммы включения GSM, собственно, сама подпрограмма перепрошивки). Я бы выделил им свой сегмент, в который линкер бы больше не пытался что-то размещать, и больше не трогал эти адреса, а всё остальное - меняй на здоровье. Это, по моему разумению, гарантировало бы нахождение блока на связи при любых условиях, с возможностью отката до предыдущей версии ПО.
|
|
|
|
|
Jul 25 2011, 12:20
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
ГЫ! Ничего не понял, потыкал, и всё получилось.
void myfunc (void) @"BLOCK2", где BLOCK2 - прописанный в линкере сегмент, типа:
. . . // ------------------------------------- // Information memory //
-Z(CONST)INFO=1800-19FF -Z(CONST)INFOA=1980-19FF -Z(CONST)INFOB=1900-197F -Z(CONST)INFOC=1880-18FF -Z(CONST)INFOD=1800-187F // ------------------------------------- // Low memory 0-0FFFF // // --------------------------- // Code // -Z(CODE)CSTART,ISR_CODE=6000-FF7F // --------------------------- // Constant data // -Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=6000-FF7F // ------------------------------------- // All memory 0-FFFFF // // --------------------------- // Code // -P(CODE)CODE=6000-FF7F,10000-45BFF -Z(CODE)CODE_ID // --------------------------- // Constant data // -Z(CONST)DATA20_C,DATA20_ID=6000-FF7F,10000-45BFF //--------------------------------------- // Our segment 5C00..5FFF 1024 bytes -Z(CODE)BLOCK1=5C00-5DFF -Z(CODE)BLOCK2=5E00-5FFF // ------------------------------------- // Interrupt vectors // -Z(CODE)INTVEC=FF80-FFFF -Z(CODE)RESET=FFFE-FFFF
Модифицированный линкер надо подключить в настройках вместо стандартного. При этом чётко кидает функцию по адресу 5E00, и больше ничего туда не пишет. Вах, как харашо! У меня вопрос снят.
|
|
|
|
Сообщений в этой теме
1921 как разместить подпрограмму по заданному адресу Jul 25 2011, 07:23 KARLSON Спасибо, 1921, за способ. Мне это тоже актуально.... Aug 29 2011, 04:55 ih_ Цитата(KARLSON @ Aug 29 2011, 08:55) ...
... Sep 1 2011, 16:18 rezident Цитата(KARLSON @ Aug 29 2011, 09:55) 1) к... Sep 1 2011, 17:39 sergeeff Коллеги! Поясните, пожалуйста, как вы потом пл... Sep 1 2011, 19:10 rezident Цитата(sergeeff @ Sep 2 2011, 00:10) Колл... Sep 1 2011, 21:31  KARLSON Цитата(sergeeff @ Sep 1 2011, 23:10) 2. А... Sep 2 2011, 04:21
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|