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

    

вопрос по MPLABX и PIC24

доброго времени суток.

стоит задача обьявить кусок флэш памяти с адреса 0x16000 как массив и задать там фиксированные данные, которые туда зальются при программировании, в процессе работы эти данные будут модифицироваться.

выполняемый код размещается как обычно в младших адресах флэша за таблицей прерываний

в принципе работает такой код

const unsigned __attribute__ ((space(prog), address (0x16000))) 

CONF[256]={0xAE,
0x12,
0xF0,0x1F,0x19,0x5B,
0x02,
0x73,0x74,0x61,0x74,0x69,0x63,0x69,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//APN[33]
};

но при компиляции почему-то выполняемый код "улетел" за этот массив

Program Memory  [Origin = 0x100, Length = 0x2ae00]

section                    address   length (PC units)   length (bytes) (dec)
-------                    -------   -----------------   --------------------
.text                        0x100               0x7e8           0xbdc  (3036)
_02F7B900_at_address_00016000   0x16000               0x200           0x300  (768)
.text.U4RXcall             0x16200               0x7a4           0xb76  (2934)
.text.TMR3call             0x169a4               0x704           0xa86  (2694)
.text.Initmc               0x170a8               0x490           0x6d8  (1752)
.dinit                     0x17538               0x294           0x3de  (990)
.text.write_cell           0x177cc               0x1d8           0x2c4  (708)
.text.MI2C3call            0x179a4               0x14c           0x1f2  (498)
.text.check_begin_end      0x17af0               0x14a           0x1ef  (495)
.text.U1RXcall             0x17c3a               0x12c           0x1c2  (450)

================как корректно задать массив, чтоб программный код остался на месте?

================как сделать так, чтобы при компиляции нужная мне процедура была размещена в конкретной области памяти с конкретного адреса?

вроде как и работает такое 

__psv__ __attribute__((space(prog), address(0x10000))) 
void  TMR3call(CIM_MSG_DESCR_PTR Msg)
{

}

но опять же за этой процедурой компилятор начинает размещать то, что раньше размещал в начале памяти 
 

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


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

А зачем вам ваш массив размещать именно по адресу  0x16000 ?

Разместите его просто во флэш, куда линкер положит, там пусть и лежит.

 

const unsigned __attribute__ ((space(prog)) 

CONF[256]={
	0xAE, 0x12, 0xF0, 0x1F, 0x19, 0x5B, 0x02, 0x73,
	0x74, 0x61, 0x74, 0x69, 0x63, 0x69, 0x70, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00
};

 

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


Ссылка на сообщение
Поделиться на другие сайты
On 11/9/2018 at 9:27 PM, dimka76 said:

А зачем вам ваш массив размещать именно по адресу  0x16000 ?

Вы наверное пост не читали:

On 11/9/2018 at 2:24 PM, s868 said:

стоит задача обьявить кусок флэш памяти с адреса 0x16000 как массив и задать там фиксированные данные, которые туда зальются при программировании, в процессе работы эти данные будут модифицироваться.


По делу, как-то давно делал такое, проблем не было, есть предположение что чтото с компилятором, каким и какой версией пользуетесь?
Как он себя поведет если массив в самый конец положить?

P.S. а... так и планировалось в массив из 16ти битных значений ложить 8ми битные данны? const unsigned __attribute__ ((space(prog), address (0x16000))) CONF[256]  = {0xF0, ...}; Как видно из мэпки, массив занимает 512(0x200) байт.

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


Ссылка на сообщение
Поделиться на другие сайты
1 hour ago, Integro said:


По делу, как-то давно делал такое, проблем не было, есть предположение что чтото с компилятором, каким и какой версией пользуетесь?
Как он себя поведет если массив в самый конец положить?

=== компилятор продолжает пихать куски кода после массива, но когда кончилось место - кладет код в начало:

версия microchip\xc16\v1.24

rogram Memory  [Origin = 0x100, Length = 0x2ae00]

section                    address   length (PC units)   length (bytes) (dec)
-------                    -------   -----------------   --------------------
.text                        0x100               0x7e8           0xbdc  (3036)
.text.U4RXcall               0x8e8               0x7a4           0xb76  (2934)
.text.TMR3call              0x108c               0x704           0xa86  (2694)
.text.Initmc                0x1790               0x490           0x6d8  (1752)
.......................................................
.text.MsgReject             0x34ee                0x12            0x1b  (27)
.text.TMR4call              0x3500                 0x8             0xc  (12)
.text.FLGcall               0x3508                 0x8             0xc  (12)
_02EAB900_at_address_0002AC00   0x2ac00               0x200           0x300  (768)
.text.U6RXcall             0x2ae00                0xfe           0x17d  (381)

P.S. а... так и планировалось в массив из 16ти битных значений ложить 8ми битные данны? const unsigned __attribute__ ((space(prog), address (0x16000))) CONF[256]  = {0xF0, ...}; Как видно из мэпки, массив занимает 512(0x200) байт.

===да, так и планировалось использовать 8бит из 24х, в итоге 256 байт массива реально займут 768 

 

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


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

Похоже на то что компилятор(а точнее линковщик) не видит в этом ничего криминального. Доступна вся флэш, вот кладет где ему удобно. Код ведь работает? Вас просто смущает положение дел и размер бинаря?) Или есть чтото еще?
Как вариант, можно попробовать включить оптимизацию по размеру файла.

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


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

в общем проблему решил путем обьявления массива в самом-самом верху флэша. всем спасибо за внимание.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация