s868 0 Posted November 9, 2018 · Report post доброго времени суток. стоит задача обьявить кусок флэш памяти с адреса 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) { } но опять же за этой процедурой компилятор начинает размещать то, что раньше размещал в начале памяти Quote Ответить с цитированием Share this post Link to post Share on other sites
dimka76 0 Posted November 9, 2018 · Report post А зачем вам ваш массив размещать именно по адресу 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 }; Quote Ответить с цитированием Share this post Link to post Share on other sites
Integro 0 Posted November 12, 2018 · Report post 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) байт. Quote Ответить с цитированием Share this post Link to post Share on other sites
s868 0 Posted November 12, 2018 · Report post 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 Quote Ответить с цитированием Share this post Link to post Share on other sites
Integro 0 Posted November 12, 2018 · Report post Похоже на то что компилятор(а точнее линковщик) не видит в этом ничего криминального. Доступна вся флэш, вот кладет где ему удобно. Код ведь работает? Вас просто смущает положение дел и размер бинаря?) Или есть чтото еще? Как вариант, можно попробовать включить оптимизацию по размеру файла. Quote Ответить с цитированием Share this post Link to post Share on other sites
s868 0 Posted November 12, 2018 · Report post в общем проблему решил путем обьявления массива в самом-самом верху флэша. всем спасибо за внимание. Quote Ответить с цитированием Share this post Link to post Share on other sites