Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Размещение констант по фиксированным адресам
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
west329_
Ув. подскажите как правильно прописывается массив констант на С в ИАР, только по фиксированному адрессу, хочу разместить его в конце флеш памяти, чтоб потом подручными средствами можно было прочесть прошивку и изманить нужные константы, не копаясь в самой прошивке.
Сергей Борщ
В скрипте линкера создаете свой сегмент (там много похожих строчек, разберетесь). В коде на С указываете #pragma location = имя сегмента. В коде на ассемблере - RSEG имя сегмента


Примеры - в документации, описании #pragma location и RSEG
west329_
Цитата(Сергей Борщ @ 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
------
west329_
пробовал так, данные при этом размещаюся в ОЗУ

#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
Сергей Борщ
Ну документацию-то надо было почитать...
Код
#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
};
west329_
Цитата(Сергей Борщ @ 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.

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

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

Скорее всего нормально. Но если вы хотите просто разместить константы в конце текста программы, то вы можете просто пододвинуть левую границу сегмента, ближе к началу. Например 100-7FF.
Сергей Борщ
Цитата(west329_ @ Jan 30 2009, 22:51) *
А как компилятор будет реагировать если посреди программы будут стоять мои константы, как ход выполнения программы ? джампы, ? будут перепрыгивать через мой сегмент.
У ИАРовского линкера есть замечательная возмжность - задавать сегменты в виде нескольких кусков памяти. Таким образом вы можете указать одну часть сегмента кода до ваших констант и вторую - после. Никаких переходов линкер вставлять не будет. Просто он сколько сможет целых функций, столько и запихнет в первую часть сегмента, что не уместилось - во вторую. За примером можно сходить в скрипты для MSP430 - у старших моделей сегмент векторов находится посреди сегмента кода.
plombir
Цитата(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
};
west329_
Цитата(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
};



интересный вариант, даже линковщик нетрогал все с первого раза заработало
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.