|
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, 20:44
|

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

|
QUOTE (AHTOXA @ Mar 23 2012, 20:03)  Как только я добавляю таким макаром хоть одну RAM-функцию, size начинает рапортовать, что размер data = 0. Может быть потому, что мы поступаем с ним не совсем честно? Вот так показывает правильно: CODE .ramfunc : { . = ALIGN(4); _sdata = .; /* start of .data label */ *(.ramfunc) *(.ramfunc.*) } > RAM AT > TEXT _sidata = LOADADDR(.ramfunc); /* start of initialized data label */ .data : { . = ALIGN(4); *(.data) *(.data.*) . = ALIGN(4); _edata = .; /* end of .data label */ } > RAM AT > TEXT Мучает другой вопрос - линкер зачем-то добавляет промежуточную функцию, и как его заставить не делать этого я пока не нашел: CODE int main() { 260c: b508 push {r3, lr} test(); 260e: f001 fe73 bl 42f8 <___Z4testv_veneer> ================================== 000042f8 <___Z4testv_veneer>: 42f8: b401 push {r0} 42fa: 4802 ldr r0, [pc, #8]; (4304 <___Z4testv_veneer+0xc>) 42fc: 4684 mov ip, r0 42fe: bc01 pop {r0} 4300: 4760 bx ip 4302: bf00 nop 4304: 100000c1 .word 0x100000c1 ================================== Disassembly of section .ramfunc:
100000c0 <test()>: volatile int u;
NOINLINE __attribute__((section(".ramfunc.hhh"))) void test() { u = 0; 100000c0: 4b01 ldr r3, [pc, #4]; (100000c8 <test()+0x8>) 100000c2: 2200 movs r2, #0 100000c4: 601a str r2, [r3, #0] } 100000c6: 4770 bx lr 100000c8: 100003a0 .word 0x100003a0
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 24 2012, 11:37
|

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

|
Цитата(Сергей Борщ @ Mar 24 2012, 02:44)  Вот так показывает правильно: Да, теперь порядок, спасибо. Цитата Мучает другой вопрос - линкер зачем-то добавляет промежуточную функцию Угу, я тоже заметил. Вот тут что-то есть про это. И ещё вот. В первой ссылке пишут, что это относится только к M0, но это не так, я компилирую для M3, и то же самое. Причём в обе стороны, при вызове из RAM-функции FLASH-функции тоже генерируется переходная функция.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 24 2012, 23:41
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Ещё странность: Код // файл ram_functions.h void WaitTimer0_16BInterrupt(unsigned char delay_cycles);
// файл __attribute__ ((__section__(".ramfunc"))) void WaitTimer0_16BInterrupt(unsigned char delay_cycles) { unsigned long counter_value=Timer0_16BCounter; counter_value+=(delay_cycles+1);
while (counter_value!=Timer0_16BCounter) ; }
// main.cpp
#include "ram_functions.h" int main() { WaitTimer0_16BInterrupt(10); while (1) { } } Программа в функцию WaitTimer0_16BInterrupt попадает, дожидается окончания паузы ...и улетает куда-то нетуда. После выхода из отладки запустить программу на отладку не удаётся. Цитата 15: Target error from Commit Flash write: Et: Flash driver not ready.
|
|
|
|
Сообщений в этой теме
_Артём_ 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     _Артём_ Цитата(AHTOXA @ Mar 23 2012, 20:03) Кстат... Mar 23 2012, 18:11      AHTOXA Цитата(_Артём_ @ Mar 24 2012, 00:11) А ес... Mar 23 2012, 18:49       _Артём_ Цитата(AHTOXA @ Mar 23 2012, 20:49) Ну, т... Mar 23 2012, 19:03        AHTOXA Цитата(_Артём_ @ Mar 24 2012, 01:03) Куда... Mar 23 2012, 20:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|