Перейти к содержанию
    

константы в ПЗУ

Подскажите, пожалуйста, что я делаю не так:

#pragma constseg=MYSEG1

const unsigned char my1[] = {0x11,0x22,0x33};

#pragma constseg=default

В настройках проекта линкер-екстра опшионс-юс комманд лайн опшионс--Z(CONST)MYSEG1=F400-F402

 

Этого достаточно, чтобы в выходном хекс файле по адресам f400-f402 появились требуемые мне конмтанты? Или я что-то упустил (версия 4.11B)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"версия 4.11B" это IAR я полагаю? Вам нужно обязательно сегмент выделять или просто разместить константы по определенному адресу? Вы вроде все верно делаете, отчего сомнения возникли? Еще можно другую прагму использовать и даже без выделения отдельного сегмента.

#pragma location=0xF400
const unsigned char my1[] = {0x11,0x22,0x33};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, 4.11B это версия IAR. Мне надо просто разместить константы.Я смотрю- для релиза запускаю дебаг, там по требуемым адресам FF, то же самое, когда грузишь файл в программатор. С Вашим вариантом- тоже самое

Изменено пользователем vic481

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, 4.11B это версия IAR. Мне надо просто разместить константы.Я смотрю- для релиза запускаю дебаг, там по требуемым адресам FF, то же самое, когда грузишь файл в программатор. С Вашим вариантом- тоже самое

"Не верю!" (с) Станиславский ;) У меня работает. Либо вы что-то не то делаете, либо ваша переменная хоть и объявлена, но не используется в данном модуле и компилятор, оптимизируя, выкидывает ее размещение. Приведите свой код.

Я по-быстрому вот такую тестовую прогу сваял. Выводит в окно терминала 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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Не верю!" (с) Станиславский ;)

У меня тоже Ваш пример работает! .Оптимизация отключена, но обращения напрямую к этим константам нет, копирую их в озу через пойнтер:

#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);

(утрированно)

Похоже, что действительно, компиллер просто выкидывает их

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте сделать объявление как

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

Работает Ваш первый вариант, обращение к объявленному массиву, иначе, похоже,действительно компиллер выкидывает эти константы, т.к. к ним нет явного обращения. Огромное спасибо!! Хотя, если у Вас будут еще варианты, чтоб работало через пойтер, буду очень признателен!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну дык введите какую-нибудь операцию фиктивного чтения из этого массива, чтобы компилятор подумао что он вам все же нужен :) Вставьте где-нибудь в начале программы, например, что-то типа

unsigned char tmp=my1[1];

Может компилятор "одумается"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#pragma required=my1

заставит компилятор и линкер не умничать, а делать что сказано.

 

Там ещё есть прикол с областью видимости объектов с квалификатором cont, она ограничена пределами модуля (файла) и компилятор полагает что внешних ссылок не может быть, стало быть можно разобраться с вопросом нужен/не нужен прямо на этапе компиляции, не откладывая до этапа линковки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#pragma required=my1

заставит компилятор и линкер не умничать, а делать что сказано.

Хм. Действительно работает. А я даже и не знал про такую прагму :cranky:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

СПАСИБО!!! Про это действительно так и написано в компиллер референс, сам не нашел :05:

Изменено пользователем vic481

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня тоже подобная проблема. Тоже 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, то всё замечательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получаю ошибку: unrecognized syntax in constseg #pragma
Вроде бы в этой версии компилятора #pragma dataseg, #pragma constseg и #pragma codeseg уже заменены на #pragma location и перед использованием сегмента в #pragma location его надо было описать в #pragma segment

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это также можно сделать c extenden keywords компилятора IAR

 

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

// или, чтобы не трогать настройки при обновлении прошивки
__root __no_init const unsigned char mes[5] @ 0x1000;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...