|
константы в ПЗУ, в очередной раз |
|
|
|
Oct 18 2008, 15:04
|
Группа: Участник
Сообщений: 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)?
|
|
|
|
|
 |
Ответов
(1 - 13)
|
Oct 18 2008, 15:31
|
Группа: Участник
Сообщений: 13
Регистрация: 19-10-05
Пользователь №: 9 837

|
Да, 4.11B это версия IAR. Мне надо просто разместить константы.Я смотрю- для релиза запускаю дебаг, там по требуемым адресам FF, то же самое, когда грузишь файл в программатор. С Вашим вариантом- тоже самое
Сообщение отредактировал vic481 - Oct 18 2008, 15:33
|
|
|
|
|
Oct 18 2008, 16:05
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(vic481 @ Oct 18 2008, 21:31)  Да, 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; }
|
|
|
|
|
Oct 18 2008, 16:20
|
Группа: Участник
Сообщений: 13
Регистрация: 19-10-05
Пользователь №: 9 837

|
Цитата(rezident @ Oct 18 2008, 21:05)  "Не верю!" (с) Станиславский  У меня тоже Ваш пример работает! .Оптимизация отключена, но обращения напрямую к этим константам нет, копирую их в озу через пойнтер: #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); (утрированно) Похоже, что действительно, компиллер просто выкидывает их
|
|
|
|
|
Oct 18 2008, 16:53
|
Группа: Участник
Сообщений: 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 Работает Ваш первый вариант, обращение к объявленному массиву, иначе, похоже,действительно компиллер выкидывает эти константы, т.к. к ним нет явного обращения. Огромное спасибо!! Хотя, если у Вас будут еще варианты, чтоб работало через пойтер, буду очень признателен!
|
|
|
|
|
Oct 19 2008, 02:42
|
Группа: Участник
Сообщений: 13
Регистрация: 19-10-05
Пользователь №: 9 837

|
СПАСИБО!!! Про это действительно так и написано в компиллер референс, сам не нашел
Сообщение отредактировал vic481 - Oct 19 2008, 02:57
|
|
|
|
|
Oct 26 2008, 19:42
|
Группа: Новичок
Сообщений: 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, то всё замечательно.
|
|
|
|
|
Oct 27 2008, 05:26
|
Участник

Группа: Свой
Сообщений: 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;
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|