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

 
 
> константы в ПЗУ, в очередной раз
vic481
сообщение Oct 18 2008, 15:04
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 19-10-05
Пользователь №: 9 837



Подскажите, пожалуйста, что я делаю не так:
#pragma constseg=MYSEG1
const unsigned char my1[] = {0x11,0x22,0x33};
#pragma constseg=default
В настройках проекта линкер-екстра опшионс-юс комманд лайн опшионс--Z(CONST)MYSEG1=F400-F402

Этого достаточно, чтобы в выходном хекс файле по адресам f400-f402 появились требуемые мне конмтанты? Или я что-то упустил (версия 4.11B)?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 13)
rezident
сообщение Oct 18 2008, 15:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



"версия 4.11B" это IAR я полагаю? Вам нужно обязательно сегмент выделять или просто разместить константы по определенному адресу? Вы вроде все верно делаете, отчего сомнения возникли? Еще можно другую прагму использовать и даже без выделения отдельного сегмента.
Код
#pragma location=0xF400
const unsigned char my1[] = {0x11,0x22,0x33};
Go to the top of the page
 
+Quote Post
vic481
сообщение Oct 18 2008, 15:31
Сообщение #3





Группа: Участник
Сообщений: 13
Регистрация: 19-10-05
Пользователь №: 9 837



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

Сообщение отредактировал vic481 - Oct 18 2008, 15:33
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 18 2008, 16:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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;
}
Go to the top of the page
 
+Quote Post
vic481
сообщение Oct 18 2008, 16:20
Сообщение #5





Группа: Участник
Сообщений: 13
Регистрация: 19-10-05
Пользователь №: 9 837



Цитата(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);
(утрированно)
Похоже, что действительно, компиллер просто выкидывает их
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 18 2008, 16:34
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Попробуйте сделать объявление как
Код
volatile const unsigned char my1[] = {0x3d,0x23,0x36};
Go to the top of the page
 
+Quote Post
vic481
сообщение Oct 18 2008, 16:53
Сообщение #7





Группа: Участник
Сообщений: 13
Регистрация: 19-10-05
Пользователь №: 9 837



Цитата(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
Работает Ваш первый вариант, обращение к объявленному массиву, иначе, похоже,действительно компиллер выкидывает эти константы, т.к. к ним нет явного обращения. Огромное спасибо!! Хотя, если у Вас будут еще варианты, чтоб работало через пойтер, буду очень признателен!
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 18 2008, 18:57
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Ну дык введите какую-нибудь операцию фиктивного чтения из этого массива, чтобы компилятор подумао что он вам все же нужен smile.gif Вставьте где-нибудь в начале программы, например, что-то типа
Код
unsigned char tmp=my1[1];

Может компилятор "одумается"?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Oct 18 2008, 20:52
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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

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


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 18 2008, 21:01
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(SSerge @ Oct 19 2008, 02:52) *
#pragma required=my1
заставит компилятор и линкер не умничать, а делать что сказано.
Хм. Действительно работает. А я даже и не знал про такую прагму cranky.gif
Go to the top of the page
 
+Quote Post
vic481
сообщение Oct 19 2008, 02:42
Сообщение #11





Группа: Участник
Сообщений: 13
Регистрация: 19-10-05
Пользователь №: 9 837



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

Сообщение отредактировал vic481 - Oct 19 2008, 02:57
Go to the top of the page
 
+Quote Post
Измеритель верёв...
сообщение Oct 26 2008, 19:42
Сообщение #12





Группа: Новичок
Сообщений: 7
Регистрация: 25-10-08
Пользователь №: 41 188



У меня тоже подобная проблема. Тоже 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, то всё замечательно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 26 2008, 22:07
Сообщение #13


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
Kurt
сообщение Oct 27 2008, 05:26
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31



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

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

// или, чтобы не трогать настройки при обновлении прошивки
__root __no_init const unsigned char mes[5] @ 0x1000;
Go to the top of the page
 
+Quote Post

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

 


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


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