реклама на сайте
подробности

 
 
> Размещение констант по фиксированным адресам, IAR,AVR,C
west329_
сообщение Jan 30 2009, 10:23
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Ув. подскажите как правильно прописывается массив констант на С в ИАР, только по фиксированному адрессу, хочу разместить его в конце флеш памяти, чтоб потом подручными средствами можно было прочесть прошивку и изманить нужные константы, не копаясь в самой прошивке.

Сообщение отредактировал west329_ - Jan 30 2009, 10:25
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
Сергей Борщ
сообщение Jan 30 2009, 11:46
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



В скрипте линкера создаете свой сегмент (там много похожих строчек, разберетесь). В коде на С указываете #pragma location = имя сегмента. В коде на ассемблере - RSEG имя сегмента


Примеры - в документации, описании #pragma location и RSEG


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
west329_
сообщение Jan 30 2009, 12:53
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Цитата(Сергей Борщ @ Jan 30 2009, 15:46) *
В скрипте линкера создаете свой сегмент (там много похожих строчек, разберетесь). В коде на С указываете #pragma location = имя сегмента. В коде на ассемблере - RSEG имя сегмента


Примеры - в документации, описании #pragma location и RSEG


в файле cfg3s.xcl

в пункте

//////////////////////////////////////////////////////////////////////////////
// Code (flash) segments
...
...
...
...
пишу следущее
-Z(CODE)MAIN_DATA_F=0x3FF0-0x3FFF



потом в файде маин
#pragma location = MAIN_DATA_F;



в итоге
Код
Error[Pe020]: identifier "MAIN_DATA_F" is undefined E:\RADIO\IAR4.21A\avr\tutor\eth_rem_dev_tcp-2.11\main.c 142
------
Go to the top of the page
 
+Quote Post
west329_
сообщение Jan 30 2009, 14:25
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



пробовал так, данные при этом размещаюся в ОЗУ

#pragma constseg=MAIN_DATA_F
const unsigned char my1[] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,
0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x11};
#pragma constseg=default


-Z(CONST)MAIN_DATA_F=700-7FF
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 30 2009, 18:29
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Ну документацию-то надо было почитать...
Код
#pragma segment = "MAIN_DATA_F"
#pragma location = "MAIN_DATA_F"

const __flash unsigned char my1[] =
{
    0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,
    0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x11
};


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
west329_
сообщение Jan 30 2009, 20:51
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Цитата(Сергей Борщ @ Jan 30 2009, 21:29) *
Ну документацию-то надо было почитать...
Код
#pragma segment = "MAIN_DATA_F"
#pragma location = "MAIN_DATA_F"

const __flash unsigned char my1[] =
{
    0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,
    0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x11
};


Благодарю за помощь всё получилось. Праввда надо было ещё -Z(CODE)MAIN_DATA_F=700-7FF вместо -Z(CONST)MAIN_DATA_F=700-7FF.

А как компилятор будет реагировать если посреди программы будут стоять мои константы, как ход выполнения программы ? джампы, ? будут перепрыгивать через мой сегмент. Интересуюсь, в реалии константы размещу после прошивки в конце флеш.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 31 2009, 21:09
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(west329_ @ Jan 30 2009, 23:51) *
А как компилятор будет реагировать если посреди программы будут стоять мои константы, как ход выполнения программы ? джампы, ? будут перепрыгивать через мой сегмент. Интересуюсь, в реалии константы размещу после прошивки в конце флеш.

smile.gif
Не компилятор, а линкер. Вот никогда не пробовал. А зачем ему дополнительные сложности создавать?

Скорее всего нормально. Но если вы хотите просто разместить константы в конце текста программы, то вы можете просто пододвинуть левую границу сегмента, ближе к началу. Например 100-7FF.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 31 2009, 22:08
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(west329_ @ Jan 30 2009, 22:51) *
А как компилятор будет реагировать если посреди программы будут стоять мои константы, как ход выполнения программы ? джампы, ? будут перепрыгивать через мой сегмент.
У ИАРовского линкера есть замечательная возмжность - задавать сегменты в виде нескольких кусков памяти. Таким образом вы можете указать одну часть сегмента кода до ваших констант и вторую - после. Никаких переходов линкер вставлять не будет. Просто он сколько сможет целых функций, столько и запихнет в первую часть сегмента, что не уместилось - во вторую. За примером можно сходить в скрипты для MSP430 - у старших моделей сегмент векторов находится посреди сегмента кода.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
plombir
сообщение Feb 1 2009, 22:06
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



Цитата(west329_ @ Jan 30 2009, 13:23) *
Ув. подскажите как правильно прописывается массив констант на С в ИАР, только по фиксированному адрессу, хочу разместить его в конце флеш памяти, чтоб потом подручными средствами можно было прочесть прошивку и изманить нужные константы, не копаясь в самой прошивке.

Код
__root __flash unsigned char my1[] @ 0x0700 =
{
    0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,
    0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x11
};
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 2 2009, 07:57
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Цитата(plombir @ Feb 2 2009, 02:06) *
Код
__root __flash unsigned char my1[] @ 0x0700 =
{
    0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,
    0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x11
};



интересный вариант, даже линковщик нетрогал все с первого раза заработало
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01441 секунд с 7
ELECTRONIX ©2004-2016