11.03.2015, 14:35
|
|
Временная регистрация
Регистрация: 05.05.2013
Сообщений: 75
Сказал спасибо: 20
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Исполнение всего кода из RAM
Цитата:
|
Если конечно не хранить код в какой-нибудь SD-карте.
|
Вот. ![Улыбка](images/smilies/icon_smile.gif) Да и неужели у МК недостаточно интерфейсов для передачи данных.
Цитата:
|
Бинарник во flash надо грузить, а он уже сам скопирует код в ОЗУ. Или не так?
|
Так работает для отдельных взятых функций, а если указать линкеру на весь проект, то он даже не генерирует файла для прошивки, который нужен при программировании flash. Отдает только бинарник.
|
|
|
|
11.03.2015, 15:13
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Исполнение всего кода из RAM
Сообщение от JerryI
|
Так работает для отдельных взятых функций, а если указать линкеру на весь проект, то он даже не генерирует файла для прошивки, который нужен при программировании flash. Отдает только бинарник.
|
А этот bin-файл нельзя прошить во флеш? Чем он отличается от случая, когда не вся прошивка в ОЗУ закидывается? Или ещё какие-то файлы генерятся в этом случае?
|
|
|
|
11.03.2015, 15:20
|
|
Временная регистрация
Регистрация: 05.05.2013
Сообщений: 75
Сказал спасибо: 20
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Исполнение всего кода из RAM
Сообщение от _Артём_
|
А этот bin-файл нельзя прошить во флеш? Чем он отличается от случая, когда не вся прошивка в ОЗУ закидывается? Или ещё какие-то файлы генерятся в этом случае?
|
File contents does not map to any valid device memory for programming Flash
|
|
|
|
11.03.2015, 15:34
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Исполнение всего кода из RAM
Сообщение от JerryI
|
File contents does not map to any valid device memory for programming Flash
|
Так может вам другой скрипт линкера надо брать?
Там изменений-то всего ничего.
В стандартном скрипте который для flash нужно добавить что-то такое:
Код:
|
.text {
__ctors_start__ = .;
KEEP(SORT(*)(.init_array)) /* eabi uses .init_array for static constructor lists */
__ctors_end__ = .;
__dtors_start__ = .;
__dtors_end__ = .;
. = ALIGN(4);
*(.text) /* remaining code */
*(.text.*)
*(.rodata) /* read-only data (constants) */
*(.rodata.*)
*(.eh_frame_hdr)
*(.eh_frame)
*(.ARM.extab* .gnu.linkonce.armextab.*)
*(.gcc_except_table)
*(.eh_frame_hdr)
*(.eh_frame)
*(.glue_7)
*(.glue_7t)
. = ALIGN(4);
}› RAM AT › FLASH |
Примерно как-то так(не факт что не ошибся где-то).
|
|
|
|
11.03.2015, 15:40
|
|
Временная регистрация
Регистрация: 05.05.2013
Сообщений: 75
Сказал спасибо: 20
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Исполнение всего кода из RAM
Сообщение от _Артём_
|
Так может вам другой скрипт линкера надо брать?
Там изменений-то всего ничего.
В стандартном скрипте который для flash нужно добавить что-то такое:
Код:
|
.text {
__ctors_start__ = .;
KEEP(SORT(*)(.init_array)) /* eabi uses .init_array for static constructor lists */
__ctors_end__ = .;
__dtors_start__ = .;
__dtors_end__ = .;
. = ALIGN(4);
*(.text) /* remaining code */
*(.text.*)
*(.rodata) /* read-only data (constants) */
*(.rodata.*)
*(.eh_frame_hdr)
*(.eh_frame)
*(.ARM.extab* .gnu.linkonce.armextab.*)
*(.gcc_except_table)
*(.eh_frame_hdr)
*(.eh_frame)
*(.glue_7)
*(.glue_7t)
. = ALIGN(4);
}› RAM AT › FLASH |
Примерно как-то так(не факт что не ошибся где-то).
|
Ругается на неизвестно что. Линкер возвращает 0.
Взгляните на оригинальный файл _sram.ld, возможно это вам что-то скажет.
Код:
|
SECTIONS
{
.text :
{
. = ALIGN(4);
_sfixed = .;
KEEP(*(.vectors .vectors.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)
*(.rodata .rodata* .gnu.linkonce.r.*)
*(.ARM.extab* .gnu.linkonce.armextab.*)
/* Support C constructors, and C destructors in both user code
and the C library. This also provides support for C++ code. */
. = ALIGN(4);
KEEP(*(.init))
. = ALIGN(4);
__preinit_array_start = .;
KEEP (*(.preinit_array))
__preinit_array_end = .;
. = ALIGN(4);
__init_array_start = .;
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
__init_array_end = .;
. = ALIGN(0x4);
KEEP (*crtbegin.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*crtend.o(.ctors))
. = ALIGN(4);
KEEP(*(.fini))
. = ALIGN(4);
__fini_array_start = .;
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
__fini_array_end = .;
KEEP (*crtbegin.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*crtend.o(.dtors))
. = ALIGN(4);
_efixed = .; /* End of text section */
} › ram
. = ALIGN(4);
_etext = .;
.relocate : AT (_etext)
{
. = ALIGN(4);
_srelocate = .;
*(.ramfunc .ramfunc.*);
*(.data .data.*);
. = ALIGN(4);
_erelocate = .;
} › ram
/* .bss section which is used for uninitialized data */
.bss (NOLOAD) :
{
. = ALIGN(4);
_sbss = . ;
_szero = .;
*(.bss .bss.*)
*(COMMON)
. = ALIGN(4);
_ebss = . ;
_ezero = .;
} › ram
/* stack section */
.stack (NOLOAD):
{
. = ALIGN(8);
_sstack = .;
. = . + STACK_SIZE;
. = ALIGN(8);
_estack = .;
} › ram
/* .ARM.exidx is sorted, so has to go in its own output section. */
PROVIDE_HIDDEN (__exidx_start = .);
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} › ram
PROVIDE_HIDDEN (__exidx_end = .);
. = ALIGN(4);
_end = . ;
} |
Я в нем понял только то, что все помещается в область ram.
|
|
|
|
11.03.2015, 17:07
|
|
Временная регистрация
Регистрация: 05.05.2013
Сообщений: 75
Сказал спасибо: 20
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Исполнение всего кода из RAM
Тьфу! Я для _sram правил
|
|
|
|
11.03.2015, 17:33
|
|
Временная регистрация
Регистрация: 05.05.2013
Сообщений: 75
Сказал спасибо: 20
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Исполнение всего кода из RAM
Внес изменения - ничего толкового. Как запускалась из flash, так и запускается.
Мне все же интересно, возможно ли затолкать бинарник скомпилированного проекта в какой-либо массив ОЗУ, а затем запустить?
Вся суть в том, что загрузочный проект МК, который хранится во flash, не был связан с загружаемой программой, а имел лишь ее код(бинарник).
|
|
|
|
11.03.2015, 20:53
|
|
Временная регистрация
Регистрация: 05.05.2013
Сообщений: 75
Сказал спасибо: 20
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Исполнение всего кода из RAM
Все работает!
1) Изменяю параметры линкера xxx_sram.ld:
Код:
|
MEMORY
{
rom (rx) : ORIGIN = 0x01000000, LENGTH = 0x00080000
ram (rwx) : ORIGIN = 0x20006000, LENGTH = 0x00020000 //Смещаю адрес ОЗУ на 0x6000 байт.
} |
2) Компилирую проект
3) Смотрю .lss файл:
Код:
|
200062b4: 20006897 .word 0x20006897
200062b8 ‹main›:
*
* \return Unused (ANSI-C compatibility).
*/
int main(void)
{
PMC-›PMC_PCER0 = PMC_PCER0_PID12;
200062b8: f44f 6380 mov |
Функция main() начинается с адреса 200062b8. Запоминаем.
4) Помещаю .bin файл в массив во flash.
5) Для запуска программы использую следующий код:
Код:
|
typedef void RAM_fn_t(void);
RAM_fn_t* fp = (RAM_fn_t*)0x200062B9; //Адрес _main() + 1 (я не знаю для чего прибавлять...)
uint8_t *addr = (uint8_t *)0x20006000; //Адрес, куда будем копировать
int main(void)
{
/* Initialize the SAM system */
SystemInit();
memcpy(addr, store, sizeof(store)); //Копируем данные программы
(*fp)(); //Запуск!
} |
|
|
|
|
11.03.2015, 23:18
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Исполнение всего кода из RAM
Сообщение от JerryI
|
//Адрес _main() + 1 (я не знаю для чего прибавлять...)
|
+1 потому что Thumb-2 - младший бит должен быть равен 1.
|
|
|
|
12.03.2015, 00:23
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Исполнение всего кода из RAM
JerryI
попробуй запустить этим методом блок в озу длиннее 0x2b8 байт ![Улыбка](images/smilies/icon_smile.gif)
когда подвиснет, подумай над порядком распределения блоков в RAM
_Артём_ спасибо, КЭП!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:22.
|
|