|
LPC1114., Исполнение программы из ОЗУ |
|
|
|
Mar 19 2012, 18:48
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Вечер добрый. Вопрос следующий: Скачал с сайта Yagarto ( пример для lpc1114). Сделал в файле main.c нём такое изменение: Код #include <stdint.h> #include "LPC11xx.h" #include "core_cm0.h"
void DelayTick(uint32_t delay) { while (delay) { while ((SysTick->CTRL&(1<<SysTick_CTRL_COUNTFLAG_Pos))==0); SysTick->CTRL = 0 | (1 << SysTick_CTRL_ENABLE_Pos) // Enable timer | (0 << SysTick_CTRL_TICKINT_Pos) // Disable SysTick interrupts | (0 << SysTick_CTRL_CLKSOURCE_Pos); // System clock/2 delay--; } }
int main (void) { LPC_GPIO0->DIR=1<<7;
// setup SysTick timer SysTick->LOAD = 48000000 / 100-1; SysTick->VAL = 0; // reset counter SysTick->CTRL = 0 | (1 << SysTick_CTRL_ENABLE_Pos) // Enable timer | (0 << SysTick_CTRL_TICKINT_Pos) // Disable SysTick interrupts | (0 << SysTick_CTRL_CLKSOURCE_Pos) // System clock/2 ; while (1) { LPC_GPIO0->DATA&=~(1<<7); DelayTick(100); LPC_GPIO0->DATA|=(1<<7); DelayTick(5);
} } То есть всё выкинул и вставил моргание светодиодом с частотой ~1Гц. Запустил на отладку - увидел то что ожидал. Дальше заменил в makefile строку Код RUN_FROM_FLASH = 1 Код RUN_FROM_FLASH = 0 Ожидал увидеть, что программа начнёт исполнятся из ОЗУ - нет, не увидел: контроллер перешёл в какое-то неизвестное мне состояние и отлаживаться отказался(выдал сообщение: No source available for ""). Дальше, запрограммировал test_ram.elf - морганий не увидел. Программатор/отладчик - LPCXpresso. Как правильно запускать программу в ОЗУ? Можно ли отлаживать программу расположенную в ОЗУ? Видимо, я хочу получить от этого примера то, для чего он совсем не предназначен. Для чего он тогда? Спасибо.
|
|
|
|
|
 |
Ответов
|
Mar 21 2012, 22:15
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Попробывал использовать в проекте функции расположенные и в RAM и во flash: Код __attribute__ ((__section__(".data.WaitTimer0_16BInterrupt"))) void WaitTimer0_16BInterrupt() { unsigned long counter_value=Timer0_16BCounter;
while (counter_value==Timer0_16BCounter); } Судя по содержимому pc выполняется из ОЗУ. Но выдаётся warning: Цитата Warning: setting incorrect section attributes for .data.WaitTimer0_16BInterrupt Или есть какие-то другие способы, более прямые?
|
|
|
|
|
Mar 22 2012, 06:39
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (_Артём_ @ Mar 22 2012, 00:15)  Или есть какие-то другие способы, более прямые? Секции .data не имеют атрибута x (executable). Надо завести свою секцию и разместить ее в выходную секцию .data: CODE .data : { . = ALIGN(4); _sdata = .; /* start of .data label */ *(.ramfunc*) *(.data*) . = ALIGN(4); _edata = .; /* end of .data label */ } > RAM AT > TEXT _sidata = LOADADDR(.data); /* start of initialized data label */
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 23 2012, 03:37
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Сергей Борщ @ Mar 22 2012, 12:39)  Сергей, может, всё же вот так: Код *(.data) *(.data.*) ? Иначе в секцию .data попадут секции с именами .datablablabla, а это может быть неправильно.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 23 2012, 15:35
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(AHTOXA @ Mar 23 2012, 05:37)  Сергей, может, всё же вот так: Код *(.data) *(.data.*) ? Иначе в секцию .data попадут секции с именами .datablablabla, а это может быть неправильно. То есть в результате пишется так: Код .data : { . = ALIGN(4); _sdata = .; /* start of .data label */ *(.ramfunc) *(.ramfunc.*) *(.data) *(.data.*) . = ALIGN(4); _edata = .; /* end of .data label */ } > RAM AT > TEXT _sidata = LOADADDR(.data); /* start of initialized data label */ . Спасибо, AHTOXA.
|
|
|
|
|
Mar 23 2012, 18:11
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(AHTOXA @ Mar 23 2012, 20:03)  Кстати, заметил интересный глюк {arm-none-eabi,arm-kgp-eabi-}size. Как только я добавляю таким макаром хоть одну RAM-функцию, size начинает рапортовать, что размер data = 0. Кстати да: Цитата text data bss dec hex filename 17028 0 5228 22256 56f0 ./exe/lcp11_test_proj.elf Errors: none Непорядок, однако. А если в скрипте пишешь так Цитата *(.ramfunc) *(.data) То Цитата text data bss dec hex filename 17012 12 5228 22252 56ec ./exe/lcp11_test_proj.elf Errors: none
|
|
|
|
|
Mar 23 2012, 18:49
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(_Артём_ @ Mar 24 2012, 00:11)  А если в скрипте пишешь так Код *(.ramfunc) *(.data) Ну, так совсем неправильно, звёздочки в конце таки нужны. (При -ffunction-sections -fdata-sections секции называются .data.имя_переменной и .ramfunc.что-то_там). Ещё поэкспериментировал. С ключом -A size выдаёт совсем другие цифры! Вот например: arm-none-eabi-size STM32VLD.elf : Код text data bss dec hex filename 11732 0 3972 15704 3d58 STM32VLD.elf arm-none-eabi-size -A STM32VLD.elf Код STM32VLD.elf : section size addr .isr_vector 464 134217728 .text 11180 134218192 .text.align 4 134229372 .data 84 536870912 .bss 3716 536870996 ._usrstack 256 536874712 .comment 83 0 Эти цифры больше похожи на правду.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 23 2012, 19:03
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(AHTOXA @ Mar 23 2012, 20:49)  Ну, так совсем неправильно, звёздочки в конце таки нужны. Не спорю - неправильно: не то скопировал. Цитата(AHTOXA @ Mar 23 2012, 20:49)  Ещё поэкспериментировал. С ключом -A size выдаёт совсем другие цифры! Куда ключ-то вставлять? Он от какого замка?
|
|
|
|
|
Mar 23 2012, 20:03
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(_Артём_ @ Mar 24 2012, 01:03)  Куда ключ-то вставлять? Он от какого замка? Дык, я же написал командную строку перед цитатой. А еcли в makefile, то вот сюда: Код $(OK): $(ELF) @$(SIZE) -A $(ELF)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
_Артём_ LPC1114. Mar 19 2012, 18:48 Сергей Борщ QUOTE (_Артём_ @ Mar 19 2012, 20:48) Даль... Mar 20 2012, 07:51 _Артём_ Спасибо, что-то начало запускаться (пока не понял ... Mar 20 2012, 11:38  Сергей Борщ QUOTE (_Артём_ @ Mar 20 2012, 13:38) Это ... Mar 20 2012, 16:54  _Артём_ Цитата(Сергей Борщ @ Mar 22 2012, 08:39) ... Mar 22 2012, 19:08   Сергей Борщ QUOTE (AHTOXA @ Mar 23 2012, 05:37) ? Ина... Mar 23 2012, 07:42     Сергей Борщ QUOTE (AHTOXA @ Mar 23 2012, 20:03) Как т... Mar 23 2012, 20:44      AHTOXA Цитата(Сергей Борщ @ Mar 24 2012, 02:44) ... Mar 24 2012, 11:37       _Артём_ Ещё странность:
Код// файл ram_functions.h
void Wa... Mar 24 2012, 23:41
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|