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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Массив констант разместить во flash памяти.
Dan_Dima
сообщение Feb 14 2007, 22:35
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 18-01-07
Пользователь №: 24 530



Необходимо массив констант разместить во flash памяти. Как это сделать в C (компилятор IAR). Массив задаеться изначально и потом не меняеться.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Feb 14 2007, 22:44
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



const int arr[10]
Go to the top of the page
 
+Quote Post
Dan_Dima
сообщение Feb 14 2007, 23:13
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 18-01-07
Пользователь №: 24 530



Цитата(jorikdima @ Feb 14 2007, 22:44) *
const int arr[10]


Притаком объявлении массив размещаеться в RAM а не во flash, а надо именно во flash.
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 14 2007, 23:43
Сообщение #4


Гуру
******

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



Цитата(Dan_Dima @ Feb 15 2007, 01:13) *
Цитата(jorikdima @ Feb 14 2007, 22:44) *

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
//*****************************************************************
Go to the top of the page
 
+Quote Post
Alex11
сообщение Feb 15 2007, 01:19
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Есть еще прямой модификатор __flash. Я только не помню точно, есть ли он для MSP430.
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 15 2007, 02:07
Сообщение #6


Гуру
******

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



Цитата(Alex11 @ Feb 15 2007, 03:19) *
Есть еще прямой модификатор __flash. Я только не помню точно, есть ли он для MSP430.

В IAR EW430 нету. Вы видимо с IAR EWAVR перепутали.
Go to the top of the page
 
+Quote Post
VAI
сообщение Feb 15 2007, 07:26
Сообщение #7


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Цитата(Dan_Dima @ Feb 15 2007, 00:13) *
Цитата(jorikdima @ Feb 14 2007, 22:44) *

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


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
rvk
сообщение Feb 15 2007, 08:44
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 165
Регистрация: 13-05-06
Из: Камышин
Пользователь №: 17 067



const word mnday @0xС600 = {....}
размещает по заранее известному адресу
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Feb 15 2007, 10:08
Сообщение #9


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



вы все таки наверно хотели спрость/сказать следующеее, как сделать так чтоб массив размещался во флеш и НЕ ПЕРЕПИСЫВАЛСЯ в РАМ после инициализации, то есть и читался потом также из флэшь. Да?
Go to the top of the page
 
+Quote Post
VAI
сообщение Feb 15 2007, 10:48
Сообщение #10


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



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

Покажите мне, где он переписывается в РАМ?
Никакой дополнительной инициализации не происходит. Все верно.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Dan_Dima
сообщение Feb 15 2007, 15:31
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 18-01-07
Пользователь №: 24 530



Все спасибо за помощь. Все правильно мой глюк smile.gif массив у меня изначально записывался во flash меня смутило что через дебагер видно что он массив при работе копирунт в RAM. В звязи с этим вопрос как от этого избавиться. Массив продекларирован в глобальной области
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 15 2007, 15:42
Сообщение #12


Гуру
******

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



Цитата(Dan_Dima @ Feb 15 2007, 17:31) *
через дебагер видно что он массив при работе копирунт в RAM. В звязи с этим вопрос как от этого избавиться.

Приведите исходный код для изучения такого странного поведения компилятора. Вы printf/sprintf для работы с этим массивом случайно не используете?
Go to the top of the page
 
+Quote Post
Dan_Dima
сообщение Feb 15 2007, 17:03
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 18-01-07
Пользователь №: 24 530



Цитата(rezident @ Feb 15 2007, 15:42) *
Цитата(Dan_Dima @ Feb 15 2007, 17:31) *

через дебагер видно что он массив при работе копирунт в 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[i],byte[i]);
};
while(1);
};
// return 0;
}
Go to the top of the page
 
+Quote Post
Serg_el
сообщение Jul 24 2008, 10:01
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 302
Регистрация: 13-12-06
Из: Togliatti
Пользователь №: 23 473



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

const unsigned char x @ 0x01000 = 1;

Но, если я не использую "x" далее в программе, а обращаюсь к адресу 0x01000 другими способами, то компилятор не записывает 1 по этому адресу. Как это обойти?
Go to the top of the page
 
+Quote Post
VAI
сообщение Jul 24 2008, 11:08
Сообщение #15


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



ну и обратитесь где нибудь к нему, как к "х".


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post

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

 


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


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