Jump to content

    

вопрос по 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)
{

}

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

Share this post


Link to post
Share on other sites

А зачем вам ваш массив размещать именно по адресу  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
};

 

Share this post


Link to post
Share on other sites
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) байт.

Share this post


Link to post
Share on other sites
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 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this