didima 0 14 февраля, 2007 Опубликовано 14 февраля, 2007 · Жалоба Необходимо массив констант разместить во flash памяти. Как это сделать в C (компилятор IAR). Массив задаеться изначально и потом не меняеться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 14 февраля, 2007 Опубликовано 14 февраля, 2007 · Жалоба const int arr[10] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
didima 0 14 февраля, 2007 Опубликовано 14 февраля, 2007 · Жалоба const int arr[10] Притаком объявлении массив размещаеться в RAM а не во flash, а надо именно во flash. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 14 февраля, 2007 Опубликовано 14 февраля, 2007 · Жалоба const int arr[10] Притаком объявлении массив размещаеться в RAM а не во flash, а надо именно во flash. Для IAR все верно указано. Квалификтор const указывает, что массив располагается в сегменте констант, а сегмент констант по-умолчанию располагается во Flash. См. сами xcl-файл. Например, в lnk430F149.xcl указано // Program and non-volatile segments (FLASH) // ========================================= // // segment address range usage // ------- ------------- -------------------------- // INFO 1000-10FF Information memory // CSTART 1100-FFDF cstartup program code // CODE 1100-FFDF Program code // DATA16_C 1100-FFDF Constant "const" variables AND String literals // DATA16_ID 1100-FFDF Initializers for DATA16_I // DIFUNCT 1100-FFDF Dynamic initialization vector used by C++ // CHECKSUM 1100-FFDF The linker places the checksum byte(s) in this segment, // when the -J linker command line option is used. // // INTVEC FFE0-FFFF Interrupt vectors // // NOTE: // It is not possible to pack the CSTART segment by using the XLINK -P option // Special function registers and peripheral modules occupy addresses 0-01FFh // Be sure to use end values for the defined addresses //***************************************************************** Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 5 15 февраля, 2007 Опубликовано 15 февраля, 2007 · Жалоба Есть еще прямой модификатор __flash. Я только не помню точно, есть ли он для MSP430. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 15 февраля, 2007 Опубликовано 15 февраля, 2007 · Жалоба Есть еще прямой модификатор __flash. Я только не помню точно, есть ли он для MSP430. В IAR EW430 нету. Вы видимо с IAR EWAVR перепутали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 15 февраля, 2007 Опубликовано 15 февраля, 2007 · Жалоба const int arr[10] Притаком объявлении массив размещаеться в RAM а не во flash, а надо именно во flash. Прежде, чем так утверждать, включите генерацию листинга и посмотрите. Для ИАРа static int sizeofreg( int reg ) { static const int s_ofreg[] = { 0, 1, 1, 2, 0, 0, 2, 2 }; return( s_ofreg[reg >> 3] ); } 20 static int sizeofreg( int reg ) 21 { \ In segment DATA16_C, align 2, align-sorted 22 static const int s_ofreg[] = { 0, 1, 1, 2, 0, 0, 2, 2 }; \ ??s_ofreg: \ 000000 000001000100 DC16 0, 1, 1, 2, 0, 0, 2, 2 \ 020000000000 \ 02000200 23 24 return( s_ofreg[reg >> 3] ); 25 } 26 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rvk 0 15 февраля, 2007 Опубликовано 15 февраля, 2007 · Жалоба const word mnday @0xС600 = {....} размещает по заранее известному адресу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 15 февраля, 2007 Опубликовано 15 февраля, 2007 · Жалоба вы все таки наверно хотели спрость/сказать следующеее, как сделать так чтоб массив размещался во флеш и НЕ ПЕРЕПИСЫВАЛСЯ в РАМ после инициализации, то есть и читался потом также из флэшь. Да? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 15 февраля, 2007 Опубликовано 15 февраля, 2007 · Жалоба да не переписывается он в РАМ и читается из флэшь, если внутри функции объявляете, то добавьте static. \ In segment CODE, align 2 20 int sizeofreg( int reg ) \ sizeofreg: 21 { 22 static const int s_ofreg[] = { 0, 1, 1, 2, 0, 0, 2, 2 }; 23 24 return( s_ofreg[reg >> 3] ); \ 000000 0C11 RRA.W R12 \ 000002 0C11 RRA.W R12 \ 000004 0C11 RRA.W R12 \ 000006 0C5C RLA.W R12 \ 000008 1C4C.... MOV.W ??s_ofreg(R12), R12 \ 00000C 3041 RET 25 } \ In segment DATA16_C, align 2, align-sorted \ ??s_ofreg: \ 000000 000001000100 DC16 0, 1, 1, 2, 0, 0, 2, 2 \ 020000000000 \ 02000200 26 Покажите мне, где он переписывается в РАМ? Никакой дополнительной инициализации не происходит. Все верно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
didima 0 15 февраля, 2007 Опубликовано 15 февраля, 2007 · Жалоба Все спасибо за помощь. Все правильно мой глюк :) массив у меня изначально записывался во flash меня смутило что через дебагер видно что он массив при работе копирунт в RAM. В звязи с этим вопрос как от этого избавиться. Массив продекларирован в глобальной области Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 15 февраля, 2007 Опубликовано 15 февраля, 2007 · Жалоба через дебагер видно что он массив при работе копирунт в RAM. В звязи с этим вопрос как от этого избавиться. Приведите исходный код для изучения такого странного поведения компилятора. Вы printf/sprintf для работы с этим массивом случайно не используете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
didima 0 15 февраля, 2007 Опубликовано 15 февраля, 2007 · Жалоба через дебагер видно что он массив при работе копирунт в RAM. В звязи с этим вопрос как от этого избавиться. Приведите исходный код для изучения такого странного поведения компилятора. Вы printf/sprintf для работы с этим массивом случайно не используете? const unsigned char addres[128]= {0x01,0x02,0x5a,0x51,0x52,0x53,0x54,0x56,0x57,0x58, //1 0x59,0x4d,0x50,0x5b,0x03,0x0c,0x0d,0x0e,0x0f,0x33, //2 0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D, //3 0x3e,0x4a,0x41,0x42,0x43,0x44,0x45,0x49,0x46,0x47, //4 0x48,0x4c,0x40,0x4b,0x70,0x71,0x72,0x60,0x6a,0x6b, //5 0x6c,0x6d,0x6e,0x6f,0x74,6,7,8,9,10, //6 1,2,3,4,5,6,7,8,9,10, //7 1,2,3,4,5,6,7,8,9,10, //8 1,2,3,4,5,6,7,8,9,10, //9 1,2,3,4,5,6,7,8,9,10, //10 1,2,3,4,5,6,7,8,9,10, //11 1,2,3,4,5,6,7,8,9,10, //12 1,2,3,4,5,6,7,8}; //13 const unsigned char byte[128]= {0x40,0x00,0x85,0x01,0x00,0x00,0x00,0x03,0x00,0x00, //1 0x00,0x00,0x10,0x00,0x00,0x14,0x28,0x42,0x56,0x0a, //2 0x03,0x03,0x00,0xff,0xff,0x85,0x34,0xa2,0x38,0x98, //3 0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00, //4 0x00,0x00,0x40,0x01,0x82,0x00,0x00,0x00,0x00,0x00, //5 0x00,0x00,0x00,0x00,0x01,6,7,8,9,10, //6 1,2,3,4,5,6,7,8,9,10, //7 1,2,3,4,5,6,7,8,9,10, //8 1,2,3,4,5,6,7,8,9,10, //9 1,2,3,4,5,6,7,8,9,10, //10 1,2,3,4,5,6,7,8,9,10, //11 1,2,3,4,5,6,7,8,9,10, //12 1,2,3,4,5,6,7,8}; //13 void write_spi( char addr,unsigned wr_byte) { int i; mask=128; SCSN_DOWN; delay(); //send byte addres /// for (i=7;i>=0;i--) { SSCK_DOWN; if ((GET_BIT(addr,mask))!=0) { MOSI_1; } else { MOSI_0; }; mask>>=1; NOP; NOP; SSCK_UP; NOP; NOP; }; //send byte addres /// delay(); //write byte from nRF mask=1; for (i=7;i>=0;i--) { SSCK_DOWN; if ((GET_BIT(wr_byte,mask))!=0) { MOSI_1; } else { MOSI_0; }; mask<<=1; NOP;NOP; SSCK_UP; NOP; NOP; }; //write byte from nRF delay(); SCSN_UP; }; void main( void ) { unsigned char i; WDTCTL = WDTPW + WDTHOLD; BCSCTL1=RSEL3+XT2OFF; Init_spi(); while(1) { for (i=0;i<55;i++) { write_spi(addres,byte); }; while(1); }; // return 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_el 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба Вот назрел вопрос... Если я хочу записать константу по определенному адресу, то я пишу следующую строку: const unsigned char x @ 0x01000 = 1; Но, если я не использую "x" далее в программе, а обращаюсь к адресу 0x01000 другими способами, то компилятор не записывает 1 по этому адресу. Как это обойти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба ну и обратитесь где нибудь к нему, как к "х". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться