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

Массив констант разместить во flash памяти.

Необходимо массив констант разместить во flash памяти. Как это сделать в C (компилятор IAR). Массив задаеться изначально и потом не меняеться.

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


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

const int arr[10]

 

Притаком объявлении массив размещаеться в RAM а не во flash, а надо именно во flash.

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


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

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

//*****************************************************************

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


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

Есть еще прямой модификатор __flash. Я только не помню точно, есть ли он для MSP430.

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


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

Есть еще прямой модификатор __flash. Я только не помню точно, есть ли он для MSP430.

В IAR EW430 нету. Вы видимо с IAR EWAVR перепутали.

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


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

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

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


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

вы все таки наверно хотели спрость/сказать следующеее, как сделать так чтоб массив размещался во флеш и НЕ ПЕРЕПИСЫВАЛСЯ в РАМ после инициализации, то есть и читался потом также из флэшь. Да?

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


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

да не переписывается он в РАМ и читается из флэшь, если внутри функции объявляете, то добавьте 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

Покажите мне, где он переписывается в РАМ?

Никакой дополнительной инициализации не происходит. Все верно.

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


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

Все спасибо за помощь. Все правильно мой глюк :) массив у меня изначально записывался во flash меня смутило что через дебагер видно что он массив при работе копирунт в RAM. В звязи с этим вопрос как от этого избавиться. Массив продекларирован в глобальной области

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


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

через дебагер видно что он массив при работе копирунт в RAM. В звязи с этим вопрос как от этого избавиться.

Приведите исходный код для изучения такого странного поведения компилятора. Вы printf/sprintf для работы с этим массивом случайно не используете?

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


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

через дебагер видно что он массив при работе копирунт в 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;

}

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


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

Вот назрел вопрос...

Если я хочу записать константу по определенному адресу, то я пишу следующую строку:

 

const unsigned char x @ 0x01000 = 1;

 

Но, если я не использую "x" далее в программе, а обращаюсь к адресу 0x01000 другими способами, то компилятор не записывает 1 по этому адресу. Как это обойти?

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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