vic481 0 18 октября, 2008 Опубликовано 18 октября, 2008 · Жалоба Подскажите, пожалуйста, что я делаю не так: #pragma constseg=MYSEG1 const unsigned char my1[] = {0x11,0x22,0x33}; #pragma constseg=default В настройках проекта линкер-екстра опшионс-юс комманд лайн опшионс--Z(CONST)MYSEG1=F400-F402 Этого достаточно, чтобы в выходном хекс файле по адресам f400-f402 появились требуемые мне конмтанты? Или я что-то упустил (версия 4.11B)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 18 октября, 2008 Опубликовано 18 октября, 2008 · Жалоба "версия 4.11B" это IAR я полагаю? Вам нужно обязательно сегмент выделять или просто разместить константы по определенному адресу? Вы вроде все верно делаете, отчего сомнения возникли? Еще можно другую прагму использовать и даже без выделения отдельного сегмента. #pragma location=0xF400 const unsigned char my1[] = {0x11,0x22,0x33}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vic481 0 18 октября, 2008 Опубликовано 18 октября, 2008 (изменено) · Жалоба Да, 4.11B это версия IAR. Мне надо просто разместить константы.Я смотрю- для релиза запускаю дебаг, там по требуемым адресам FF, то же самое, когда грузишь файл в программатор. С Вашим вариантом- тоже самое Изменено 18 октября, 2008 пользователем vic481 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 18 октября, 2008 Опубликовано 18 октября, 2008 · Жалоба Да, 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vic481 0 18 октября, 2008 Опубликовано 18 октября, 2008 · Жалоба "Не верю!" (с) Станиславский ;) У меня тоже Ваш пример работает! .Оптимизация отключена, но обращения напрямую к этим константам нет, копирую их в озу через пойнтер: #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 0 18 октября, 2008 Опубликовано 18 октября, 2008 · Жалоба Попробуйте сделать объявление как volatile const unsigned char my1[] = {0x3d,0x23,0x36}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vic481 0 18 октября, 2008 Опубликовано 18 октября, 2008 · Жалоба Попробуйте сделать объявление как 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 0 18 октября, 2008 Опубликовано 18 октября, 2008 · Жалоба Ну дык введите какую-нибудь операцию фиктивного чтения из этого массива, чтобы компилятор подумао что он вам все же нужен :) Вставьте где-нибудь в начале программы, например, что-то типа unsigned char tmp=my1[1]; Может компилятор "одумается"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 18 октября, 2008 Опубликовано 18 октября, 2008 · Жалоба #pragma required=my1 заставит компилятор и линкер не умничать, а делать что сказано. Там ещё есть прикол с областью видимости объектов с квалификатором cont, она ограничена пределами модуля (файла) и компилятор полагает что внешних ссылок не может быть, стало быть можно разобраться с вопросом нужен/не нужен прямо на этапе компиляции, не откладывая до этапа линковки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 18 октября, 2008 Опубликовано 18 октября, 2008 · Жалоба #pragma required=my1 заставит компилятор и линкер не умничать, а делать что сказано. Хм. Действительно работает. А я даже и не знал про такую прагму :cranky: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vic481 0 19 октября, 2008 Опубликовано 19 октября, 2008 (изменено) · Жалоба СПАСИБО!!! Про это действительно так и написано в компиллер референс, сам не нашел :05: Изменено 19 октября, 2008 пользователем vic481 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alteron 0 26 октября, 2008 Опубликовано 26 октября, 2008 · Жалоба У меня тоже подобная проблема. Тоже 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, то всё замечательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 26 октября, 2008 Опубликовано 26 октября, 2008 · Жалоба Получаю ошибку: unrecognized syntax in constseg #pragmaВроде бы в этой версии компилятора #pragma dataseg, #pragma constseg и #pragma codeseg уже заменены на #pragma location и перед использованием сегмента в #pragma location его надо было описать в #pragma segment Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kurt 0 27 октября, 2008 Опубликовано 27 октября, 2008 · Жалоба это также можно сделать c extenden keywords компилятора IAR __root const unsigned char mes[] @ 0x1000 = {1,2,3,4,5}; // или, чтобы не трогать настройки при обновлении прошивки __root __no_init const unsigned char mes[5] @ 0x1000; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться