Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: константы в ПЗУ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
vic481
Подскажите, пожалуйста, что я делаю не так:
#pragma constseg=MYSEG1
const unsigned char my1[] = {0x11,0x22,0x33};
#pragma constseg=default
В настройках проекта линкер-екстра опшионс-юс комманд лайн опшионс--Z(CONST)MYSEG1=F400-F402

Этого достаточно, чтобы в выходном хекс файле по адресам f400-f402 появились требуемые мне конмтанты? Или я что-то упустил (версия 4.11B)?
rezident
"версия 4.11B" это IAR я полагаю? Вам нужно обязательно сегмент выделять или просто разместить константы по определенному адресу? Вы вроде все верно делаете, отчего сомнения возникли? Еще можно другую прагму использовать и даже без выделения отдельного сегмента.
Код
#pragma location=0xF400
const unsigned char my1[] = {0x11,0x22,0x33};
vic481
Да, 4.11B это версия IAR. Мне надо просто разместить константы.Я смотрю- для релиза запускаю дебаг, там по требуемым адресам FF, то же самое, когда грузишь файл в программатор. С Вашим вариантом- тоже самое
rezident
Цитата(vic481 @ Oct 18 2008, 21:31) *
Да, 4.11B это версия IAR. Мне надо просто разместить константы.Я смотрю- для релиза запускаю дебаг, там по требуемым адресам FF, то же самое, когда грузишь файл в программатор. С Вашим вариантом- тоже самое

"Не верю!" (с) Станиславский wink.gif У меня работает. Либо вы что-то не то делаете, либо ваша переменная хоть и объявлена, но не используется в данном модуле и компилятор, оптимизируя, выкидывает ее размещение. Приведите свой код.
Я по-быстрому вот такую тестовую прогу сваял. Выводит в окно терминала C-CPY числа от 1 до 5. Размещение в памяти по указанному адресу имеется, как и положено.
Код
#include <msp430x14x.h>
#include <stdio.h>

#define TICK_VALUE  16 //system tick in ms

#pragma location=0xF400
const unsigned char mes[] = {1,2,3,4,5};

volatile unsigned int time;

void main(void)
{ unsigned int timestump=0, idx=0;
  WDTCTL=WDT_ADLY_16;
  IE1=WDTIE;
  _EINT();
  while(1)
  { if ((time-timestump)>=1000)
    { timestump=time;
      printf("%d\r\n", mes[idx]);
      if (idx<(sizeof(mes)-1))
        idx++;
      else
        idx=0;
    }
  }
}

#pragma vector=WDT_VECTOR
#pragma type_attribute=__interrupt
void WDT_ISR(void)
{ time+=TICK_VALUE;
}
vic481
Цитата(rezident @ Oct 18 2008, 21:05) *
"Не верю!" (с) Станиславский wink.gif

У меня тоже Ваш пример работает! .Оптимизация отключена, но обращения напрямую к этим константам нет, копирую их в озу через пойнтер:
#pragma constseg=MYSEG1
const unsigned char my1[] = {0x3d,0x23,0x36};
#pragma constseg=default
....
int main( void )
for(i=0;i<0x3;i++);
*(unsigned char*)(0x0220+i)=*(unsigned char*)(0xF400+i);
(утрированно)
Похоже, что действительно, компиллер просто выкидывает их
rezident
Попробуйте сделать объявление как
Код
volatile const unsigned char my1[] = {0x3d,0x23,0x36};
vic481
Цитата(rezident @ Oct 18 2008, 21:34) *
Попробуйте сделать объявление как
Код
volatile const unsigned char my1[] = {0x3d,0x23,0x36};

Error[Be022]: location address not allowed for initialized variables (writable variables without the __no_init attribute) C:\3\main.c 43
Работает Ваш первый вариант, обращение к объявленному массиву, иначе, похоже,действительно компиллер выкидывает эти константы, т.к. к ним нет явного обращения. Огромное спасибо!! Хотя, если у Вас будут еще варианты, чтоб работало через пойтер, буду очень признателен!
rezident
Ну дык введите какую-нибудь операцию фиктивного чтения из этого массива, чтобы компилятор подумао что он вам все же нужен smile.gif Вставьте где-нибудь в начале программы, например, что-то типа
Код
unsigned char tmp=my1[1];

Может компилятор "одумается"?
SSerge
#pragma required=my1
заставит компилятор и линкер не умничать, а делать что сказано.

Там ещё есть прикол с областью видимости объектов с квалификатором cont, она ограничена пределами модуля (файла) и компилятор полагает что внешних ссылок не может быть, стало быть можно разобраться с вопросом нужен/не нужен прямо на этапе компиляции, не откладывая до этапа линковки.
rezident
Цитата(SSerge @ Oct 19 2008, 02:52) *
#pragma required=my1
заставит компилятор и линкер не умничать, а делать что сказано.
Хм. Действительно работает. А я даже и не знал про такую прагму cranky.gif
vic481
СПАСИБО!!! Про это действительно так и написано в компиллер референс, сам не нашел 05.gif
Измеритель верёвочками
У меня тоже подобная проблема. Тоже IAR 4.11B. MSP430F1232.

Код
#pragma constseg = INFOA
const unsigned char pribors_array[4][4] = {
  {01, 0, 0, 0x7F},
  {0xFF, 0xFF, 0xFF, 0xFF},
  {0xFF, 0xFF, 0xFF, 0xFF},
  {0xFF, 0xFF, 0xFF, 0xFF}
};
#pragma constseg=default


Получаю ошибку: unrecognized syntax in constseg #pragma

В программе обращения к массиву есть как к переменной (не через указатели).

Если ставлю #pragma constseg = INFOB, то всё замечательно.
Сергей Борщ
Цитата(Измеритель верёвочками @ Oct 26 2008, 22:42) *
Получаю ошибку: unrecognized syntax in constseg #pragma
Вроде бы в этой версии компилятора #pragma dataseg, #pragma constseg и #pragma codeseg уже заменены на #pragma location и перед использованием сегмента в #pragma location его надо было описать в #pragma segment
Kurt
это также можно сделать c extenden keywords компилятора IAR

Код
__root const unsigned char mes[] @ 0x1000 = {1,2,3,4,5};

// или, чтобы не трогать настройки при обновлении прошивки
__root __no_init const unsigned char mes[5] @ 0x1000;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.