Выполнить из внешнего SRAM

Пито
Чт 22 декабря 2016 г. 10:58 утра
Скорее всего, не применимо для плат MM или BP, но с более крупными платами Zet6 это может быть интересным упражнением :)
Ищу простой способ сообщить компилятору/линкеру, чтобы разместить код и запустить его с адреса во внешнем SRAM.
Например, у меня есть свободное место 512 КБ от 0x68000000 (103Zet6) и 64 КБ внутри.
Выполнение от внешнего SRAM будет медленнее, однако размер создает интересные возможности.
Внутренний SRAM все еще может быть использован для векторов/стека и быстрых буферов.
Вариант будет заключаться в том, чтобы поместить конкретные функции во внешний SRAM.
Если наши основные и C -эксперты знают, как и могут дать намек, я готов уточнить.

Пито
Чт 22 декабря 2016 г., 11:14
Например, я нашел в https: // ez.аналоговый.com/thread/10607
Запуск кода от SRAM в GNU GCC..
Прежде всего, вам нужен переключатель –mlong-звонки, указанный в компиляторе. Это необходимо, поскольку вызовые функции во вспышке от SRAM или наоборот, требуют инструкции по филиалам, которая может разветвлять “дальше”. Затем вам нужно следующее в доступном файле заголовка или в верхней части файла C, который будет его использовать

#define ramfunc __attribute__ ((long_call, section (".ramfunctions "))))))

Это макрос для атрибута функции, который вы можете применить к функции, которую вы хотите в SRAM. Это действительно просто помещает функцию в раздел под названием “.Рэмфункции”, где он будет помещен в раздел под названием “.текст” по умолчанию. (Нам нужно обновить сценарий линкера на более позднем шаге, чтобы рассказать линкеру, что делать с .ramfunctions). Вы можете применить это к конкретным функциям, как показано ниже. (Вы также должны применить его к прототипу).

Ramfunc void myramfunc (unsigned uinumsamples);

Ramfunc void myramfunc (unsigned uinumsamples) {
// Функциональное тело
}

Это работает для функций C, вам необходимо поместить что -то подобное в верхней части функций ассемблера (снова помещение кода в соответствующим образом названные разделы).

.раздел ".ramfunctions "
.Выравнивание 8
.Глобальный Путонечар
.большой палец
.thumb_func
.Тип Путонечар, %функция

Затем в файле сценария линкера (*.LD) Вам нужно что -то вроде линии красного цвета, вставленной, чтобы сообщить линкеру, чтобы поместить функции, помеченные как .Рамфункция в SRAM.

.Данные: AT (_ETEXT)
{
_data = .;
*(vtable vtable.*)
*(.данные .данные.*)
*(.гну.Linkonce.D*)
. = Выровнять (4);
*(.ramfunctions) /* !!!! Размещение функций в .Раздел Ramfunctions в RAM */
_Edata = . ;
} > Шрам

Это сохранит функцию во флэш -память с самого начала, а затем скопируйте ее автоматически в SRAM, прежде чем она будет выполнена (почти идентично тому, как обрабатываются инициализированные переменные). Просто поместите Ramfunc на любую функцию, которую вы хотите в ОЗУ. Имейте в виду, что атрибут должен применяться к любой функции, которую также вызывает эта функция.

Стивестронг
Чт 22 декабря 2016 12:38
Интересный. Я использовал аналогичную технику на платформе на базе 8051 за десять лет назад, но только потому, что бег от SRAM был намного быстрее, чем бег от Flash, что, кажется, здесь не так.
Но откуда должен быть код? От вспышки? Если он уже подходит во вспышке, то вы могли бы просто запустить его оттуда, это тоже будет быстрее.
С другой стороны, более значимым, было бы неплохо загрузить код выборочно сформировать SD -карту и дать ей запускать из SRAM. Но потом вы должны как -то сначала принести кодовые части на SD -карту...

Пито
Чт 22 декабря 2016 г. 15:01
Да, окончательным решением было бы загрузить куски с SDCARD, например,. Но это долгий путь..
Таким образом, в качестве первого шага мы должны получить текст+Data+BSS во внешний SRAM.

Рик Кимбалл
Чт 22 декабря 2016 г., 17:07
Я использовал это раньше с внутренней оперативной памятью на MSP432, где у вспышки 4 состояния ожидания при работе при 48 МГц. Чип имеет изобилие внутренней оперативной памяти (64K). В этом варианте использования он идеально подходит для критического кода времени и будет работать в нулевых состояниях ожидания. Если вы не используете командную строку -mlong -calls или прагмы, компилятор будет генерировать «виниры», в основном локальные анонимные функции, которые выполняют ПК LDR, [ПК], с дальним адресом, как константа слова. 200000b8 <___ZN7print_tI16serial_default_tILm9600ELm72000000E8GPIO_PINILm1ELm9EES1_ILm0ELm65535EEEE5_putsEPKh.isra.4_veneer>: 200000b8: f85f f000 ldr.w pc, [pc] ; 200000bc <___ZN7print_tI16serial_default_tILm9600ELm72000000E8GPIO_PINILm1ELm9EES1_ILm0ELm65535EEEE5_putsEPKh.isra.4_veneer+0x4> 200000bc: 08000277 .word 0x08000277

Пито
Чт 22 декабря 2016 г., 18:20
Выполнение от внешнего SRAM может быть в 5-6 раз медленнее, чем от вспышки (или меньше, поскольку вспышка 2 Вт, а не искусство с 103, кстати).
RD/WR с SRAM 10NS может быть 6/4CYCLE для 103ZET6, или что -то в этом роде.
http: // www.ул.com/content/ccc/resource/ ... 200423.PDF
Но скорость здесь не является критическим фактором. Возможность сбежать с внешнего SRAM является основной мотивацией.

Пито
Ср 28 декабря 2016 г., 21:09
В качестве эксперимента по сравнению с быстрой скоростью я сгенерировал 30000 случайных чисел UINT16 и отсортирован с помощью Bubblesort.
Только массив был помещен во внешний SRAM (10NS 256KX16). Массив доступ к указателям, а не в куче.
Внутренний SRAM:
Generating 30000 16bit uints: BubbleSorting 30000 16bit uints: Elapsed: 147182682 usecs Sorted last 100 in ascending order: 29900 65270 29901 65271 29902 65274 29903 65281 29904 65282 29905 65287 29906 65288 .. 29994 65516 29995 65518 29996 65519 29997 65523 29998 65528 29999 65533

Пито
Чт 29 декабря 2016 г. 12:34
К вашему сведению - для сравнения доступа 8/16/32 бит через FSMC (массив, доступный через указатели, а не в куче):
BubbleSorting 30000 8bit uints: Elapsed: 241123281 usecs BubbleSorting 30000 16bit uints: Elapsed: 275602656 usecs BubbleSorting 30000 32bit uints: Elapsed: 323401444 usecs

Пито
Сб 31 декабря 2016 г. 18:37
В то же время у меня есть большая куча 512 КБ, работающая внутри внешней SRAM (через FSMC).
Вот некоторые результаты при запуске стандартного Bubblesort на наборе из 3000, сгенерированных случайных UINT для различных размеров.
Bubblesort_1.jpg
Bubblesort_1.JPG (37.78 киб) просмотрено 14916 раз

victor_pv
Пн, 02 января 2017 г., 3:30 утра
Pito, у старого загрузчика Leadlabs была возможность загрузить эскиз для оперативной памяти и запустить оттуда.
Это сработало, было наличием отдельного сценария линкера, который использует любой адрес, с которого вы хотите запустить (я не помню, где FSMC сидит на карте памяти, но какой бы адрес был).
При использовании этого сценария линкера он не скомпилировал ничего, чтобы использовать Flash Addreses, все пошли по адресам RAM, поэтому вам не нужно было делать что -то другое в вашем коде, все было сделано линкером для каждого фрагмента кода, константы, и т. д. Очевидно, кто -то должен был скопировать все это в ОЗУ перед запуском, но это было сделано исходным загрузчиком с определенной опцией загрузки.

Затем при загрузке эскиза на плату Maple, загрузчик будет тот, который скопирует этот код в ОЗУ, начиная с адреса, в котором был установлен линкер, и, наконец, вызовут точку входа.

Сгрупчик уже был на плате, линкер даже не знает об этом, и сгенерированный двоичный файл не включает в себя какую -либо подпрограмму для копирования программы от Flash в Ram. Он ссылается точно так же, как если бы он будет работать от Flash, но использует адрес для RAM. Вы поймете, если будет лучше, если загрузите этот линейный скрипт и проверит его.

Я сделал несколько тестов самостоятельно, работая от обычной оперативной памяти, но с пользовательским загрузчиком, который сначала записывал эскиз, чтобы вспыхивать, а затем скопировать его в ОЗУ и запустить его. Если бы доска была перезагружена, она скопировала бы набросок снова в Озра. Я делал это, когда делал некоторые скоростные тесты, работающие с оперативной памяти, и хотел избежать необходимости загрузки при сбросе.

Я бы сделал то же самое для вашего дела, за исключением того, что, учитывая размер, я согласен с тем, что лучше использовать SDCARD для хранения кода. Итак, вы могли:
1.- Напишите эскиз, чтобы запустить из Flash, которая инициализирует FSMC, а затем получите доступ к SDCARD и считывает любой файл, который вы хотите, копирует его в ОЗУ, а затем вызовите точку записи. Это должно быть легко сделать.
2.- Создайте новый вариант платы, который использует модифицированный сценарий линкера, который связывает исполняемый код с нижней частью адреса FSMC. Сгенерированный файл бин может быть скопирован в SDCARD и загружен и выполнен программой, описанной в пункте 1.
Вы также можете изменить тот же сценарий линкера, чтобы поместить стек в верхней части внешнего адреса ОЗУ, поскольку в тот момент, когда код призван к запуску, FSMC уже инициализируется, но может быть быстрее, чтобы сохранить стек во внутренней памяти для скорость.
3.- Убедитесь, что код, сгенерированный в точке 2, не отключает FSMC, изменяет функцию вывода, используемого для FSMC, или что -то в этом роде.

Это был сценарий кленового линкера для Ram, называемый Ram.LD: /* * libmaple linker script for RAM builds. * * A Flash build puts .text, .rodata, and .data/.bss/heap (of course) * in SRAM, but offsets the sections by enough space to store the * Maple bootloader, which uses low memory. */ /* * This pulls in the appropriate MEMORY declaration from the right * subdirectory of stm32/mem/ (the environment must call ld with the * right include directory flags to make this happen). Boards can also * use this file to use any of libmaple's memory-related hooks (like * where the heap should live). */ INCLUDE mem-ram.inc /* Provide memory region aliases for common.inc */ REGION_ALIAS("REGION_TEXT", ram); REGION_ALIAS("REGION_DATA", ram); REGION_ALIAS("REGION_BSS", ram); REGION_ALIAS("REGION_RODATA", ram); /* Let common.inc handle the real work. */ INCLUDE common.inc

Пито
Пн, 02 января 2017 г., 17:04
Это имеет смысл, но дьявол в деталях - как приблизиться к нему, шаг за шагом.
Мой первый шаг состоял в том, чтобы оживить FSMC и двойную проверку, это работает - это было сделано.

FSMC на этой вики -доске 103zet6 работает такая, что делает Exram Bank3 = 0x68000000 до 0x68080000 (256KX16) прозрачным для руки.

Мой второй шаг состоял в том, чтобы начать перемещать вещи в Exram - самый простой шаг был с кучей. Не нужно, чтобы FSMC был инициализирован до начала C, поэтому я все еще делаю это в Setup (). Таким образом, моя куча теперь от 0x68000000 до 0x6807fff8. И это работает.

Теперь - я бы начал экспериментировать со старшим загрузчиком для компиляции для оперативной памяти, но FSMC должен быть инициирован в CRT0.S или где -то в этом роде.
Я уже нашел некоторые подсказки - он описан в примерах STM для FSMC, но не уверен, что мы используем тот же механизм CRT0 здесь.

Таким образом, следующим шагом является поместить инициацию FSMC в файлы запуска C.

victor_pv
Пн, 02 января 2017 г., 17:56
Пито написал:Это имеет смысл, но дьявол в деталях - как приблизиться к нему, шаг за шагом.
Мой первый шаг состоял в том, чтобы оживить FSMC и двойную проверку, это работает - это было сделано.

FSMC на этой вики -доске 103zet6 работает такая, что делает Exram Bank3 = 0x68000000 до 0x68080000 (256KX16) прозрачным для руки.

Мой второй шаг состоял в том, чтобы начать перемещать вещи в Exram - самый простой шаг был с кучей. Не нужно, чтобы FSMC был инициализирован до начала C, поэтому я все еще делаю это в Setup (). Таким образом, моя куча теперь от 0x68000000 до 0x6807fff8. И это работает.

Теперь - я бы начал экспериментировать со старшим загрузчиком для компиляции для оперативной памяти, но FSMC должен быть инициирован в CRT0.S или где -то в этом роде.
Я уже нашел некоторые подсказки - он описан в примерах STM для FSMC, но не уверен, что мы используем тот же механизм CRT0 здесь.

Таким образом, следующим шагом является поместить инициацию FSMC в файлы запуска C.

Пито
Пн, 02 января 2017 г., 18:03
Я имею в виду функцию «void SystemInit_extmemctl (void)», я обнаружил в примерах STM, что инициализирует FSMC.
* Called in startup_stm32f10x_xx.s/.c before jump to main. * This function configures the external SRAM mounted on STM3210E-EVAL * board (STM32 High density devices). This SRAM will be used as program * data memory (including heap and stack).

victor_pv
Пн, 02 января 2017 г. 18:16
Пито написал:Я имею в виду функцию «void SystemInit_extmemctl (void)», я обнаружил в примерах STM, что инициализирует FSMC.
* Called in startup_stm32f10x_xx.s/.c before jump to main. * This function configures the external SRAM mounted on STM3210E-EVAL * board (STM32 High density devices). This SRAM will be used as program * data memory (including heap and stack).

Пито
Пн, 02 января 2017 г. 18:32
Пошаговый подход :)
Теперь упражнение собирается «включить FSMC» внутри «System Init» (где на самом деле??), таковые у нас есть FSMC живой и прозрачный, прежде чем «что -то хочет возиться» с Exram.. Т.е., копировать инициализированные данные из Flash в Exram во время init или что -то в этом роде :)

Фактическая последовательность для Bank1_Ne3 (0x68000000-..) является: RCC->AHBENR = 0x00000114; RCC->APB2ENR = 0x000001E0; GPIOD->CRL = 0x44BB44BB; GPIOD->CRH = 0xBBBBBBBB; GPIOE->CRL = 0xB44444BB; GPIOE->CRH = 0xBBBBBBBB; GPIOF->CRL = 0x44BBBBBB; GPIOF->CRH = 0xBBBB4444; GPIOG->CRL = 0x44BBBBBB; GPIOG->CRH = 0x44444B44; FSMC_Bank1->BTCR[4] = 0x00001011; FSMC_Bank1->BTCR[5] = 0x00000200;

Пито
Пн, 02 января 2017 г., 19:03
Хорошо, я сделал это по -другому - я поместил рутину FSMC init из эскиза в функцию setup_fsmc () и помещаю в доски.CPP: void init(void) { setup_flash(); setup_clocks(); setup_nvic(); systick_init(SYSTICK_RELOAD_VAL); wirish::priv::board_setup_gpio(); setup_adcs(); setup_timers(); wirish::priv::board_setup_usb(); wirish::priv::series_init(); boardInit(); setup_fsmc(); // <<< }

Пито
Пн, 02 января 2017 г. 20:43
victor_pv написал:..Я бы сделал то же самое для вашего дела, за исключением того, что, учитывая размер, я согласен с тем, что лучше использовать SDCARD для хранения кода. Итак, вы могли:
1.- Напишите эскиз, чтобы запустить из Flash, которая инициализирует FSMC, а затем получите доступ к SDCARD и считывает любой файл, который вы хотите, копирует его в ОЗУ, а затем вызовите точку записи. Это должно быть легко сделать.
2.- Создайте новый вариант платы, который использует модифицированный сценарий линкера, который связывает исполняемый код с нижней частью адреса FSMC. Сгенерированный файл бин может быть скопирован в SDCARD и загружен и выполнен программой, описанной в пункте 1.
Вы также можете изменить тот же сценарий линкера, чтобы поместить стек в верхней части внешнего адреса ОЗУ, поскольку в тот момент, когда код призван к запуску, FSMC уже инициализируется, но может быть быстрее, чтобы сохранить стек во внутренней памяти для скорость.
3.- Убедитесь, что код, сгенерированный в точке 2, не отключает FSMC, изменяет функцию вывода, используемого для FSMC, или что -то в этом роде.
..

ZMEMW16
Вторник 03 января 2017 12:28
У кого -нибудь есть источники для ДДТ ?
О, головные дни : D

SRP

Пито
Вторник 03 января 2017 12:17
Следующие шаги сделали:

1. Я построил пример Bubblesort с модифицированным файлом линкера - все разделы, размещенные в Exram от 0x68000000.
А .Файл карты показывает, что он помещается в Exram (текст, данные, BSS, куча, стек..)
Start_c.C включает в себя инициализацию FSMC, но, как описано выше - FSMC инициализируется непосредственно перед прыжком к основному - это может вызвать проблемы при заканчивании из Exram, как и до инициализации FSMC, есть упражнение с копированием внутри сегмента ОЗУ, работающего в start_c.в .. :зло: :?

2. Я преобразовал полученный.Файл бин в c-include-array, который будет включен через Bubblesort.H в эскиз: static unsigned char bubbsort[] = { 0x00, 0x00, 0x08, 0x68, 0xbd, 0x08, 0x00, 0x68, 0x11, 0x0c, 0x00, 0x68, 0x15, 0x0c, 0x00, 0x68, 0x19, 0x0c, 0x00, 0x68, 0x1d, 0x0c, 0x00, 0x68, .. 0x02, 0x00, 0x01, 0x04, 0x03, 0x09, 0x04, 0x00, 0x43, 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x68, 0xb8, 0x42, 0x00, 0x68 }; unsigned int bubbsort_len = 23132;

Ахулл
Вторник 03 января 2017 12:52
Я предполагаю, что это риторический вопрос, но я предполагаю...
void branch_to_sram() { asm("bl sram_start8;") }

Пито
Вторник 03 января 2017 г. 13:10
Serial.println("Starting the .bin:"); asm("bl sram_start8;"); or asm("bl sram_start8\n\t");

Пито
Вторник 03 января 2017 г. 13:30
asm( "r sram_start8";)

victor_pv
Вторник 03 января 2017 г. 14:37
Проверьте исходный код Bootloader, чтобы увидеть, как он вызывает код эскиза, я бы использовал точно так же.

Я не помню, как это было, но это отлично работает как для внутренней оперативной памяти, так и для внутренней вспышки, поэтому я уверен, что это будет работать одинаково для адреса в Exram.


РЕДАКТИРОВАТЬ:
Вот как это делает это в основном, когда он запустит эскиз во Flash: jumpToUser(USER_CODE_FLASH);

Пито
Вторник 03 января 2017 г., 17:26
Эта функция jumptouser не будет компилировать в эскизе легко, так как она поступает из среды загрузчика.
Итак, нам нужен обходной путь.
Правление: http: // wiki.STM32duino.com/index.PHP?тип ... 32F103ZET6
и вам нужен 256KX16 или 512KX16 10-55NS SRAM, TSOP44_2, 3.3 В (!) (Много различных доступных типов).
Правление работает нормально, 12 долларов. SRAM, который я использую, AS7C34098A-10TCN $ 3.50 :)
Итак, первые 4 байта, адрес стека, следующий 4 байта, адрес кода инициализации Первые байты .Bin Start: 0x00, 0x00, 0x08, 0x68, 0xc9, 0x01, 0x00, 0x68, 0x31, 0x05, 0x00, 0x68, 0x35, 0x05, 0x00, 0x68, 0x39, 0x05, 0x00, 0x68, 0x3d, 0x05, 0x00, 0x68, 0x41, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0xfd, 0x08, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x85, 0x16, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x95, 0x0a, 0x00, 0x68, 0xb9, 0x0a, 0x00, 0x68, 0xdd, 0x0a, 0x00, 0x68, 0x15, 0x0b, 0x00, 0x68, 0x69, 0x0b, 0x00, 0x68, 0xd9, 0x0b, 0x00, 0x68, 0x49, 0x0c, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x9d, 0x0e, 0x00, 0x68, 0xed, 0x0e, 0x00, 0x68, 0x3d, 0x0f, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x71, 0x0d, 0x00, 0x68, 0x95, 0x0d, 0x00, 0x68, 0xb9, 0x0d, 0x00, 0x68, 0xf1, 0x0d, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0xb9, 0x0c, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x8d, 0x0f, 0x00, 0x68, 0xdd, 0x0f, 0x00, 0x68, 0x29, 0x0d, 0x00, 0x68, 0x4d, 0x0d, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x91, 0x05, 0x00, 0x68, 0x10, 0xb5, 0x05, 0x4c, 0x23, 0x78, 0x33, 0xb9,

victor_pv
Вторник 03 января 2017 г. 18:03
Таким образом, стек будет на 0x68080000
соответствует ли это тому, как вы настроили сценарий линкера?
И точка записи кода будет на 0x680001C9

Так что все это выглядит правильно.

Какие ошибки вы получаете компиляцию? Вероятно, некоторые типы отсутствуют, но мы можем скопировать их из кода загрузчика.

РЕДАКТИРОВАТЬ:
Нам, скорее всего, нужно добавить определение этого типа, вы можете добавить его в саму функцию: typedef volatile unsigned long vu32;

Пито
Вторник 03 января 2017 г. 18:10
Эти два парня не объявлены в этой области
nvicDisableTervruprrupts ();
Msr_msp ( *(uint32 *) usraddr);
void jumpToUser(uint32 usrAddr) { typedef void (*funcPtr)(void); uint32 jumpAddr = *(volatile uint32 *)(usrAddr + 0x04); /* reset ptr in vector table */ funcPtr usrMain = (funcPtr) jumpAddr; nvicDisableInterrupts(); __MSR_MSP(*(volatile uint32 *) usrAddr); /* set the users stack ptr */ usrMain(); /* go! */ }

victor_pv
Вторник 03 января 2017 г. 18:24
Пито написал:Эти два парня не объявлены в этой области
nvicDisableTervruprrupts ();
Msr_msp ( *(uint32 *) usraddr);
void jumpToUser(uint32 usrAddr) { typedef void (*funcPtr)(void); uint32 jumpAddr = *(volatile uint32 *)(usrAddr + 0x04); /* reset ptr in vector table */ funcPtr usrMain = (funcPtr) jumpAddr; nvicDisableInterrupts(); __MSR_MSP(*(volatile uint32 *) usrAddr); /* set the users stack ptr */ usrMain(); /* go! */ }

Пито
Вторник 03 января 2017 г. 18:31
Это компилирует, но все еще не весело.
Я изменил корзину.H к более простому Helloworld, поэтому мы должны увидеть 10x Helloworld распечатаны, когда успешно бега. // Loads and runs the .bin out of the EXRAM #include "bin.h" #include "cortexm3_macro.h" // Start of FSMC SRAM BANK 1, REGION 3 static uint8 *const sram_start8 = (uint8*)0x68000000; #define EXRAM8(x) (*(sram_start8+x)) void jumpToUser(u32 usrAddr) { typedef void (*funcPtr)(void); u32 jumpAddr = *(vu32 *)(usrAddr + 0x04); /* reset ptr in vector table */ funcPtr usrMain = (funcPtr) jumpAddr; //nvicDisableInterrupts(); __MSR_MSP(*(vu32 *) usrAddr); /* set the users stack ptr */ usrMain(); /* go! */ } void setup() { Serial.begin(115200); // wait on USB while(!Serial.isConnected()); pinMode(PC13, OUTPUT); digitalWrite(PC13, LOW); int i; // copy the .bin into the EXRAM for (i = 0; i < bin_len; i++) { EXRAM8(i) = bin[i]; } // print out the first 8 and last 8 bytes from the .bin in EXRAM to verify the FSMC works // if FSMC does not work you will read FF for (i = 0; i < 8; i++) { Serial.print(i); Serial.print(" "); Serial.println(EXRAM8(i),HEX); } for (i = bin_len - 8; i < bin_len; i++) { Serial.print(i); Serial.print(" "); Serial.println(EXRAM8(i),HEX); } // jump to Main in EXRAM Serial.println("Starting the .bin:"); jumpToUser(0x680001c9); } void loop() { }

victor_pv
Вторник 03 января 2017 г., 19:02
Пито написал:Это компилирует, но все еще не весело.
Я изменил корзину.H к более простому Helloworld, поэтому мы должны увидеть 10x Helloworld распечатаны, когда успешно бега. // Loads and runs the .bin out of the EXRAM #include "bin.h" #include "cortexm3_macro.h" // Start of FSMC SRAM BANK 1, REGION 3 static uint8 *const sram_start8 = (uint8*)0x68000000; #define EXRAM8(x) (*(sram_start8+x)) void jumpToUser(u32 usrAddr) { typedef void (*funcPtr)(void); u32 jumpAddr = *(vu32 *)(usrAddr + 0x04); /* reset ptr in vector table */ funcPtr usrMain = (funcPtr) jumpAddr; //nvicDisableInterrupts(); __MSR_MSP(*(vu32 *) usrAddr); /* set the users stack ptr */ usrMain(); /* go! */ } void setup() { Serial.begin(115200); // wait on USB while(!Serial.isConnected()); pinMode(PC13, OUTPUT); digitalWrite(PC13, LOW); int i; // copy the .bin into the EXRAM for (i = 0; i < bin_len; i++) { EXRAM8(i) = bin[i]; } // print out the first 8 and last 8 bytes from the .bin in EXRAM to verify the FSMC works // if FSMC does not work you will read FF for (i = 0; i < 8; i++) { Serial.print(i); Serial.print(" "); Serial.println(EXRAM8(i),HEX); } for (i = bin_len - 8; i < bin_len; i++) { Serial.print(i); Serial.print(" "); Serial.println(EXRAM8(i),HEX); } // jump to Main in EXRAM Serial.println("Starting the .bin:"); jumpToUser(0x680001c9); } void loop() { }

Пито
Вторник 03 января 2017 г., 19:11
Это булавки FSMC, которые должны работать при обтягивании с Exram (возможно, кроме NE1,2,4 и NBL1): void fsmc_sram_init_gpios(void) { /* Data lines... */ gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); /* Address lines... */ gpio_set_mode(GPIOD, 11, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOD, 12, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOD, 13, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 0, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 1, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 2, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 3, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 4, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 5, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 12, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 13, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 14, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 15, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 0, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 1, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 2, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 3, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 4, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 5, GPIO_AF_OUTPUT_PP); /* And control lines... */ gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP); // NOE gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP); // NWE gpio_set_mode(GPIOD, 7, GPIO_AF_OUTPUT_PP); // NE1 gpio_set_mode(GPIOG, 9, GPIO_AF_OUTPUT_PP); // NE2 gpio_set_mode(GPIOG, 10, GPIO_AF_OUTPUT_PP); // NE3 gpio_set_mode(GPIOG, 12, GPIO_AF_OUTPUT_PP); // NE4 gpio_set_mode(GPIOE, 0, GPIO_AF_OUTPUT_PP); // NBL0 gpio_set_mode(GPIOE, 1, GPIO_AF_OUTPUT_PP); // NBL1 }

Пито
Вторник 03 января 2017 г., 8:00 вечера
С /** * Initialize and reset all available GPIO devices. */ void gpio_init_all(void) { gpio_init(GPIOA); gpio_init(GPIOB); gpio_init(GPIOC); // gpio_init(GPIOD); // We need it for FSMC !! #ifdef STM32_HIGH_DENSITY // gpio_init(GPIOE); // We need it for FSMC !! // gpio_init(GPIOF); // We need it for FSMC !! // gpio_init(GPIOG); // We need it for FSMC !! #endif }

Пито
Вторник 03 января 2017 г., 8:17 вечера
Все еще не весело, даже кажется, что настройка FSMC GPIO, инициализированная в начале start_c.C только работает сейчас :)

victor_pv
Вторник 03 января 2017 г., 8:32 вечера
__weak void board_setup_gpio(void) { gpio_init_all(); }

Пито
Вторник 03 января 2017 г., 21:13
Настройка GPIO FSMC, кажется, способна пережить init (), поэтому я оставлю его, как и для времени..
Init () портит часы, конечно.
Когда я установил в start_c.C часы: /* Enable FSMC clock */ RCC_BASE->AHBENR = 0x00000114; /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */ RCC_BASE->APB2ENR = 0x00001E0;

victor_pv
Вторник 03 января 2017 г. 22:26
Пито написал:Настройка GPIO FSMC, кажется, способна пережить init (), поэтому я оставлю его, как и для времени..
Init () портит часы, конечно.
Когда я установил в start_c.C часы: /* Enable FSMC clock */ RCC_BASE->AHBENR = 0x00000114; /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */ RCC_BASE->APB2ENR = 0x00001E0;

Пито
Вторник 03 января 2017 г. 22:41
Отключен с void nvicDisableInterrupts() { // NVIC_TypeDef *rNVIC = (NVIC_TypeDef *) NVIC_BASE; NVIC_BASE->ICER[0] = 0xFFFFFFFF; NVIC_BASE->ICER[1] = 0xFFFFFFFF; NVIC_BASE->ICPR[0] = 0xFFFFFFFF; NVIC_BASE->ICPR[1] = 0xFFFFFFFF; //SET_REG(STK_CTRL, 0x04); /* disable the systick, which operates separately from nvic */ systick_disable(); }

Пито
Вторник 03 января 2017 г. 11:58
objdump -s источник.эльф > место назначения.LST
void jumpToUser(u32 usrAddr) { 80021a4: b538 push {r3, r4, r5, lr} 80021a6: 4604 mov r4, r0 typedef void (*funcPtr)(void); u32 jumpAddr = *(vu32 *)(usrAddr + 0x04); /* reset ptr in vector table */ 80021a8: 6845 ldr r5, [r0, #4] funcPtr usrMain = (funcPtr) jumpAddr; nvicDisableInterrupts(); 80021aa: f7ff ffeb bl 8002184 <_Z21nvicDisableInterruptsv> __MSR_MSP(*(vu32 *) usrAddr); /* set the users stack ptr */ 80021ae: 6820 ldr r0, [r4, #0] 80021b0: f7fd ff26 bl 8000000 <__stm32_vector_table-0x2000> //SET_REG(SCB_VTOR, (vu32) (usrAddr)); SCB_BASE->VTOR = (vu32) (usrAddr); 80021b4: 4b03 ldr r3, [pc, #12] ; (80021c4 <_Z10jumpToUserm+0x20>) 80021b6: 609c str r4, [r3, #8] asm volatile("msr msp, %0"::"g" (*(volatile u32 *)usrAddr)); 80021b8: 6823 ldr r3, [r4, #0] 80021ba: f383 8808 msr MSP, r3 usrMain(); /* go! */ 80021be: 47a8 blx r5 80021c0: bd38 pop {r3, r4, r5, pc} 80021c2: bf00 nop 80021c4: e000ed00 .word 0xe000ed00 080021c8 <_Z5setupv>: }

victor_pv
Ср. 04 января 2017 г. 14:04
Насколько я знаю, ассемблер выглядит нормально, за исключением того, что я не знаю, почему это там, если он прокомментирован в источнике:
__MSR_MSP(*(vu32 *) usrAddr); /* set the users stack ptr */ 80021ae: 6820 ldr r0, [r4, #0] 80021b0: f7fd ff26 bl 8000000 <__stm32_vector_table-0x2000>

Пито
Ср. 04 января 2017 г., 17:34
Что из этого может быть отключено в приложении? void init(void) { // setup_flash(); // setup_clocks(); setup_nvic(); systick_init(SYSTICK_RELOAD_VAL); wirish::priv::board_setup_gpio(); setup_adcs(); setup_timers(); wirish::priv::board_setup_usb(); wirish::priv::series_init(); boardInit(); }

victor_pv
Ср. 04 января 2017 г. 18:55
Пито написал:Что из этого может быть отключено в приложении? void init(void) { // setup_flash(); // setup_clocks(); setup_nvic(); systick_init(SYSTICK_RELOAD_VAL); wirish::priv::board_setup_gpio(); setup_adcs(); setup_timers(); wirish::priv::board_setup_usb(); wirish::priv::series_init(); boardInit(); }

Пито
Ср. 04 января 2017 г., 19:05
Теперь я могу «подключиться» к J-Link ST-Link или Segger.
Единственная проблема в том, что у меня нет окружающей среды, готовой к отладке (и никогда не делал это под Ideuino). В прошлый раз, когда я это делал.. :(
Так что любой намек на то, как создать такую ​​среду под Ideuino и Win7, приветствуется :)

Пито
Ср. 04 января 2017 г., 19:49
Мы можем попробовать под Cygwin - запустить сервер OpenOCD в одном терминале: pito@W7 ~/openocd-0.9.0 $ bin-x64/openocd.exe -f scripts/interface/stlink-v2.cfg -f scripts/target/stm3 2f1x_stlink.cfg Open On-Chip Debugger 0.9.0 (2015-05-19-12:09) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html WARNING: target/stm32f1x_stlink.cfg is deprecated, please switch to target/stm32 f1x.cfg Info : auto-selecting first available session transport "hla_swd". To override u se 'transport select '. Info : The selected transport took over low-level target control. The results mi ght differ compared to plain JTAG/SWD adapter speed: 1000 kHz adapter_nsrst_delay: 100 none separate Info : Unable to match requested speed 1000 kHz, using 950 kHz Info : Unable to match requested speed 1000 kHz, using 950 kHz Info : clock speed 950 kHz Info : STLINK v2 JTAG v27 API v2 SWIM v6 VID 0x0483 PID 0x3748 Info : using stlink api v2 Info : Target voltage: 3.221011 Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints Info : accepting 'gdb' connection on tcp/3333 Info : device id = 0x10036414 Info : flash size = 512kbytes undefined debug reason 7 - target needs reset

victor_pv
Ср. 04 января 2017 г., 19:49
Пито написал:Теперь я могу «подключиться» к J-Link ST-Link или Segger.
Единственная проблема в том, что у меня нет окружающей среды, готовой к отладке (и никогда не делал это под Ideuino). В прошлый раз, когда я это делал.. :(
Так что любой намек на то, как создать такую ​​среду под Ideuino и Win7, приветствуется :)

Пито
Ср. 04 января 2017 г. 20:18
Откройте второй терминал с Arm-None-Eabi-GDB: $ C:/Users/pito/AppData/Local/Arduino15/packages/arduino/tools/arm-none-eabi-gc c/4.8.3-2014q1/bin/arm-none-eabi-gdb C:/Users/pito/AppData/Local/Temp/arduino_b uild_197663/STM_Run_Bin_from_exRAM_jumpmain.ino.elf GNU gdb (GNU Tools for ARM Embedded Processors) 7.6.0.20140228-cvs Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=i686-w64-mingw32 --target=arm-none-eabi". For bug reporting instructions, please see: ... Reading symbols from C:\Users\pito\AppData\Local\Temp\arduino_build_197663\STM_R un_Bin_from_exRAM_jumpmain.ino.elf...done. (gdb) target remote :3333 Remote debugging using :3333 0x00000000 in ?? () (gdb) break jumpToUser Breakpoint 1 at 0x8002186: file C:\Users\pito\MyCode\Arduino\STM32\STM_Run_Bin_f rom_exRAM_jumpmain/STM_Run_Bin_from_exRAM_jumpmain.ino, line 35. (gdb) monitor reset halt target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x080000f0 msp: 0x20005000 (gdb) continue Continuing. Note: automatically using hardware breakpoints for read-only addresses. Breakpoint 1, jumpToUser (usrAddr=1744830957) at C:\Users\pito\MyCode\Arduino\STM32\STM_Run_Bin_from_exRAM_jumpmain/STM_Ru n_Bin_from_exRAM_jumpmain.ino:35 35 __MSR_MSP(*(vu32 *) usrAddr); /* set the users stack ptr */ (gdb) break usrMain Function "usrMain" not defined. Make breakpoint pending on future shared library load? (y or [n]) n (gdb) print usrMain $1 = (gdb)

Пито
Ср. 04 января 2017 г. 9:20 вечера
void jumpToUser(u32 usrAddr) { typedef void (*funcPtr)(void); u32 jumpAddr = *(vu32 *)(usrAddr + 0x04); /* reset ptr in vector table */ volatile funcPtr usrMain = (funcPtr) jumpAddr; // nvicDisableInterrupts(); __MSR_MSP(*(vu32 *) usrAddr); /* set the users stack ptr */ // SET_REG(SCB_VTOR, (vu32) (usrAddr)); // SCB_BASE->VTOR = (vu32) (usrAddr); // asm volatile("msr msp, %0"::"g" (*(volatile u32 *)usrAddr)); usrMain(); /* go! */ <<<<<<<< breakpoint line 43 }

victor_pv
Ср. 04 января 2017 г., 21:26
У меня нет опыта работы с GDB, но эти отпечатки должны печатать полный 32 -битный адрес? Похоже, они печатают только 2 байта, верно?

Я думаю, что прыжок не происходит правильно, не уверен, что значение или Jumpaddr не отображаются правильно или на самом деле не верны, но я думаю, что ему нужно иметь 4 байта адреса, где начинается код Exram и не является это выглядит так, как это происходит.

Пито
Ср. 04 января 2017 г., 21:47
Я добавил выше содержимого регистров, в то время как в строке 43 = вызов USRMAIN ();
Затем следующий шаг вылетает, Ctrl-C дает Sigint в UTIL.C - Assert хочет зажечь светодиод ошибки.
Мы прыгаем Serial.println("Starting the .bin:"); jumpToUser(0x680001ed);

Пито
Ср. 04 января 2017 22:08
Теперь второй вариант void jumpToUser(u32 usrAddr) { typedef void (*funcPtr)(void); u32 jumpAddr = *(vu32 *)(usrAddr + 0x04); /* reset ptr in vector table */ volatile funcPtr usrMain = (funcPtr) jumpAddr; // nvicDisableInterrupts(); // __MSR_MSP(*(vu32 *) usrAddr); /* set the users stack ptr */ // SET_REG(SCB_VTOR, (vu32) (usrAddr)); SCB_BASE->VTOR = (vu32) (usrAddr); asm volatile("msr msp, %0"::"g" (*(volatile u32 *)usrAddr)); usrMain(); /* go! */ <<<< Breakpoint 2 line 43 }

victor_pv
Ср. 04 января 2017 г. 22:17
Я думаю, что это связано с длинными звонками, которые уже упоминал Рик, но как мы заставляем компилятора сделать там долгий звонок там?

Правильный ли этот адрес с вашей новой мусорной корзиной Exram? (Это должно быть содержание второго 32 -битного слова) r0 0x680001ed 1744830957 <<<< jumpToUser(0x680001ed);??

Пито
Ср. 04 января 2017 22:29
Погрузчик построен с "... -Dmcu_stm32f103ze -mlong -kalls -mthumb ..." Breakpoint 2, jumpToUser (usrAddr=) at C:\Users\pito\MyCode\Arduino\STM32\STM_Run_Bin_from_exRAM_jumpmain/STM_Ru n_Bin_from_exRAM_jumpmain.ino:43 43 Addr)); 3: jumpAddr = 15012 2: usrMain = (funcPtr) 0x3aa4 1: usrAddr = (gdb) info registers r0 0x680001ed 1744830957 r1 0x0 0 r2 0x8091 32913 r3 0xe000ed00 -536810240 r4 0x3aa4 15012 r5 0x20000008 536870920 r6 0x8003381 134230913 r7 0x8003219 134230553 r8 0x8003331 134230833 r9 0x0 0 r10 0xcedef1f0 -824249872 r11 0xda8ba3b3 -628382797 r12 0x1010101 16843009 sp 0x2000ffc8 0x2000ffc8 lr 0x800223d 134226493 pc 0x800218e 0x800218e xPSR 0x61000000 1627389952 (gdb) step Warning: Cannot insert breakpoint 0. Error accessing memory address 0xfffffff9: (undocumented errno -1). 0xfffffffe in ?? () (gdb)

victor_pv
Ср. 04 января 2017 г. 22:37
Можете ли вы опубликовать код ассемблера для функции, на которую мы смотрели?

В предыдущем, который вы опубликовали, показали это: usrMain(); /* go! */ 80021be: 47a8 blx r5

Пито
Ср. 04 января 2017 г. 22:37
Что произойдет, когда в строке 43 ПК будет изменен в GDB на 0x680001ed??

С Longcall 08002184 <_Z10jumpToUserm>: //SET_REG(STK_CTRL, 0x04); /* disable the systick, which operates separately from nvic */ systick_disable(); } void jumpToUser(u32 usrAddr) { 8002184: b507 push {r0, r1, r2, lr} typedef void (*funcPtr)(void); u32 jumpAddr = *(vu32 *)(usrAddr + 0x04); /* reset ptr in vector table */ 8002186: 6843 ldr r3, [r0, #4] volatile funcPtr usrMain = (funcPtr) jumpAddr; 8002188: 9301 str r3, [sp, #4] // __MSR_MSP(*(vu32 *) usrAddr); /* set the users stack ptr */ // SET_REG(SCB_VTOR, (vu32) (usrAddr)); SCB_BASE->VTOR = (vu32) (usrAddr); 800218a: 4b05 ldr r3, [pc, #20] ; (80021a0 <_Z10jumpToUserm+0x1c>) 800218c: 6098 str r0, [r3, #8] asm volatile("msr msp, %0"::"g" (*(volatile u32 *)usrAddr)); 800218e: 6803 ldr r3, [r0, #0] 8002190: f383 8808 msr MSP, r3 usrMain(); /* go! */ 8002194: 9b01 ldr r3, [sp, #4] 8002196: 4798 blx r3 } 8002198: b003 add sp, #12 800219a: f85d fb04 ldr.w pc, [sp], #4 800219e: bf00 nop 80021a0: e000ed00 .word 0xe000ed00

victor_pv
Ср. 04 января 2017 г. 22:45
Пито написал:Что произойдет, когда в строке 43 ПК будет изменен в GDB на 0x680001ed??

Пито
Ср. 04 января 2017 г. 22:53
(gdb) jump 0x680001ed Function "0x680001ed" not defined. (gdb) set $pc = 0x680001ed .. sp 0x2000ffc8 0x2000ffc8 lr 0x800223d 134226493 pc 0x680001ed 0x680001ed xPSR 0x61000000 1627389952 .. (gdb) continue Continuing. Program received signal SIGINT, Interrupt. 0xfffffffe in ?? () (gdb) Continuing.

victor_pv
Ср. 04 января 2017 г. 22:57
Нашел кого -то еще, что делает что -то похожее на NOR: (похоже, код был прямо с ST)

https: // github.com/fablabseoul/wingproj ... Ute/Main.в

Код выглядит довольно похоже на то, что мы пытаемся использовать, но немного отличается и использует __io
typedef void (*pFunction)(void); /* Private define ------------------------------------------------------------*/ #define ApplicationAddress ((uint32_t)0x64000000) /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ pFunction Jump_To_Application; __IO uint32_t JumpAddress;

Пито
Ср. 04 января 2017 11:02
Когда я расстроен, он сбой вокруг dis_int Breakpoint 1, jumpToUser (usrAddr=1744830957) at C:\Users\pito\MyCode\Arduino\STM32\STM_Run_Bin_from_exRAM_jumpmain/STM_Ru n_Bin_from_exRAM_jumpmain.ino:35 35 ); 3: jumpAddr = 2: usrMain = 1: usrAddr = 1744830957 (gdb) step 30 u32 jumpAddr = *(vu32 *)(usrAddr + 0x04); /* reset ptr in vector tab le */ 3: jumpAddr = 2: usrMain = 1: usrAddr = 1744830957 (gdb) step setup () at C:\Users\pito\MyCode\Arduino\STM32\STM_Run_Bin_from_exRAM_jumpmain/STM_Ru n_Bin_from_exRAM_jumpmain.ino:46 46 */ (gdb) step __irq_tim1_trg_com () at C:\Users\pito\MyCode\Arduino\hardware\Arduino_STM32SerBuff\STM32F1\cores\ maple\libmaple\timer.c:453 453 dispatch_adv_trg_com(TIMER1); (gdb) step dispatch_adv_trg_com (dev=0x20003be8 ) at C:\Users\pito\MyCode\Arduino\hardware\Arduino_STM32SerBuff\STM32F1\system /libmaple/timer_private.h:157 157 timer_adv_reg_map *regs = (dev->regs).adv; (gdb) step 158 uint32 dsr = regs->DIER & regs->SR; (gdb) step Warning: Cannot insert breakpoint 0. Error accessing memory address 0xfffffff9: (undocumented errno -1). 0xfffffffe in ?? () (gdb)

Пито
Ср. 04 января 2017 11:18
Где определяется __IO ?
'__Io' не называет типа
нестабильный?
Также «__SET_MSP» не был объявлен в этой области

victor_pv
Ср. 04 января 2017 г. 11:19
Пито написал:Где определяется __IO ?
'__Io' не называет типа
нестабильный?

Пито
Ср. 04 января 2017 г. 11:40
http: // Stackoverflow.com/Question/1439 ... 6#14406706
https: // www.LPCWARE.com/content/forum/h ... Ppplication

Не уверен, что это правильно void jumpToUser(u32 usrAddr) { typedef void (*funcPtr)(void); u32 jumpAddr = *(vu32 *)(usrAddr + 4); /* reset ptr in vector table */

Пито
Ср. 04 января 2017 г. 11:53
Это компилируется // Loads the .bin into the EXRAM #include "bin.h" __attribute__( ( always_inline ) ) static inline void __set_CONTROL(uint32_t control){ __asm volatile ("MSR control, %0" : : "r" (control) : "memory"); } __attribute__( ( always_inline ) ) static inline void __set_MSP(uint32_t topOfMainStack){ __asm volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); } typedef void (*pFunction)(void); /* Private define ------------------------------------------------------------*/ #define ApplicationAddress ((uint32_t)0x68000000) #define __IO volatile /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ pFunction Jump_To_Application; __IO uint32_t JumpAddress; // Start of FSMC SRAM BANK 1, REGION 3 static uint8 *const sram_start8 = (uint8*)0x68000000; #define EXRAM8(x) (*(sram_start8+x)) void nvicDisableInterrupts() { // NVIC_TypeDef *rNVIC = (NVIC_TypeDef *) NVIC_BASE; NVIC_BASE->ICER[0] = 0xFFFFFFFF; NVIC_BASE->ICER[1] = 0xFFFFFFFF; NVIC_BASE->ICPR[0] = 0xFFFFFFFF; NVIC_BASE->ICPR[1] = 0xFFFFFFFF; //SET_REG(STK_CTRL, 0x04); /* disable the systick, which operates separately from nvic */ systick_disable(); } void setup() { // put your setup code here, to run once: Serial.begin(115200); // wait on USB while(!Serial.isConnected()); // pinMode(PC13, OUTPUT); // digitalWrite(PC13, LOW); int i; for (i = 0; i < bin_len; i++) { EXRAM8(i) = bin[i]; } for (i = 0; i < 8; i++) { Serial.print(i); Serial.print(" "); Serial.println(EXRAM8(i),HEX); } for (i = bin_len - 8; i < bin_len; i++) { Serial.print(i); Serial.print(" "); Serial.println(EXRAM8(i),HEX); } Serial.println("Starting the .bin:"); /* Jump to code loaded in NOR memory and execute it *************************/ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_CONTROL(0); // Change from PSP to MSP __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); } void loop() { // put your main code here, to run repeatedly: }

victor_pv
Чт, 05 января 2017 г. 12:05
Пито написал:http: // Stackoverflow.com/Question/1439 ... 6#14406706
https: // www.LPCWARE.com/content/forum/h ... Ppplication

Не уверен, что это правильно void jumpToUser(u32 usrAddr) { typedef void (*funcPtr)(void); u32 jumpAddr = *(vu32 *)(usrAddr + 4); /* reset ptr in vector table */

Пито
Чт, 05 января 2017 г. 12:22
:) Первые признаки улучшения - светодиод продолжается, но сбои, прерывания, включенные в Loader, использовали последний источник загрузчика выше. (gdb) continue Continuing. Program received signal SIGINT, Interrupt. 0x680012a2 in ?? () (gdb) info registers r0 0x12c 300 r1 0x0 0 r2 0x0 0 r3 0x68003de8 1744846312 r4 0x3 3 r5 0x20000008 536870920 r6 0x8003381 134230913 r7 0x8003219 134230553 r8 0x8003331 134230833 r9 0xffdfffff -2097153 r10 0xdedef170 -555814544 r11 0xda8ba393 -628382829 r12 0x1010101 16843009 sp 0x6807f7e8 0x6807f7e8 lr 0x680001a1 1744830881 pc 0x680012a2 0x680012a2 xPSR 0x81000000 -2130706432 (gdb)

victor_pv
Чт, 05 января 2017 г. 1:52
Какую функцию выполняет этот адрес ПК, принадлежащий?

Интересно, не делаем ли мы что -то правильно с таблицей NVIC, я посмотрю на таблицу данных.

Пито
Чт 05 января 2017 г. 2:00 утра
Какую функцию выполняет этот адрес ПК, принадлежащий?Я переписывался Helloworld, так что .эльф и .Файл карты исчез.. Я закрыл IDE и все, кроме .Ино потерян. Но это в задержке () imo.
Кажется, мы теряем Systick или что -то в этом роде.
Я установил светодиод, затем сделал задержку (300), затем установил светодиод.
Светодиод зажжен, и задержка разбилась. R0 содержал «300» после аварии.

Теперь я переписываюсь с задержкой (3000) в самом начале, затем я установил светодиод, и когда я запускаю, я ничего не вижу.

Мой GDB остановился, чтобы установить точки останова в определенной строке кода, поэтому я должен переустановить его или изучить ручное руководство f ** _.
:зло: Использование этого инструмента и IDE - кошмар : Twisted:

victor_pv
Чт, 05 января 2017 г. 2:38
Это может повлиять. Это в досках.CPP и должен быть кодом, перемещающим векторную таблицу на правильный адрес (в RAM FSMC для мусорного ведра). nvic_init((uint32)VECT_TAB_ADDR, 0); 162 163 /* Roger Clark. We now control nvic vector table in boards.txt using the build.vect paramater …

Пито
Чт, 05 января 2017 2:47
Прилагал разобранный текст.LST файл Helloworld, скомпилированный для Exram.
Векторная таблица нуждается в дублехке, конечно. При сбросе системы векторная таблица фиксируется по адресу 0x00000000. Привилегированное программное обеспечение может записать в VTOR для переезда адрес начала векторного таблицы в другое местоположение памяти, в диапазоне от 0X00000080 до 0x3fffff80, см. Наши старт в 0x68000000.. :)
Вы ссылаетесь на этот вектор?: ########################### Generic STM32F103Z ########################### genericSTM32F103Z.name=Generic STM32F103Z series genericSTM32F103Z.vid.0=0x1EAF genericSTM32F103Z.pid.0=0x0004 genericSTM32F103Z.build.variant=generic_stm32f103z genericSTM32F103Z.build.vect=VECT_TAB_ADDR=0x8000000 <<< SHALL BE 0x68000000 ? genericSTM32F103Z.build.core=maple genericSTM32F103Z.build.board=GENERIC_STM32F103Z

victor_pv
Чт, 05 января 2017 г. 3:58 утра
Да, этот векторный параметр.
Это используется функцией, называемой во время init (), которая записывается в реестр VTOR, чтобы переместить таблицу.
Таким образом, код держал таблицу, указывающей на вспышку, но векторная таблица во флэшн не содержит правильных указателей для ISR в Exram.
static void setup_nvic(void) { nvic_init((uint32)VECT_TAB_ADDR, 0); /* Roger Clark. We now control nvic vector table in boards.txt using the build.vect paramater #ifdef VECT_TAB_FLASH nvic_init(USER_ADDR_ROM, 0); #elif defined VECT_TAB_RAM nvic_init(USER_ADDR_RAM, 0); #elif defined VECT_TAB_BASE nvic_init((uint32)0x08000000, 0); #elif defined VECT_TAB_ADDR // A numerically supplied value nvic_init((uint32)VECT_TAB_ADDR, 0); #else // Use the __text_start__ value from the linker script; this // should be the start of the vector table. nvic_init((uint32)&__text_start__, 0); #endif */ }

Пито
Чт, 05 января 2017 г. 9:29
Нет изменений с genericSTM32F103Z.build.vect=VECT_TAB_ADDR=0x68000000

Пито
Чт, 05 января 2017 г. 10:35 утра
Озон: работает нормально!
Прыжок прыгает в Exram, выполняет код там, я могу преодолеть его разборку, но я не могу установить точки останова на линию C или отслеживать источник приложения C (потому что это загруженная .мусорное ведро).
Когда он продолжится, он заканчивается:
Озон Exram.jpg
Озон Exram.JPG (158.19 киб) просмотрено 288 раз

Пито
Чт, 05 января 2017 г., 11:35
Здесь он приходит к задержке (3000) - в самом начале приложения.
При прохождении через него он переходит между 680015AC и ..15b2 "навсегда", при том, что не изменяется ни в одном из регистров, кроме PC и CycleCount.
R0 содержит "3000", r1 = r2 = 0 (он читает Millis () == 0??)
Это код: 680015a8 <_Z5delaym>: 680015a8: 4b03 ldr r3, [pc, #12] ; (680015b8 <_Z5delaym+0x10>) 680015aa: 6819 ldr r1, [r3, #0] 680015ac: 681a ldr r2, [r3, #0] #include #include void delay(unsigned long ms) { uint32 start = millis(); while (millis() - start < ms) 680015ae: 1a52 subs r2, r2, r1 680015b0: 4282 cmp r2, r0 680015b2: d3fb bcc.n 680015ac <_Z5delaym+0x4> ; } 680015b4: 4770 bx lr 680015b6: bf00 nop 680015b8: 680041b8 .word 0x680041b8 680015bc <_Z7pinModeh13WiringPinMode>: void pinMode(uint8 pin, WiringPinMode mode) { gpio_pin_mode outputMode; bool pwm = false; if (pin >= BOARD_NR_GPIO_PINS) { 680015bc: 286f cmp r0, #111 ; 0x6f

victor_pv
Чт, 05 января 2017 г. 13:53
Миллис () читает значение, обновленное Systick. Я подозреваю, что Systick не работает, и поэтому счетчик никогда не увеличивает.
Вы можете проверить озон?
1- VTOR Регистр получает правильное значение, указывающее на таблицу Exram NVIC
2- Функция Systick находится где-то в этом мусорном ведре, а указатель NVIC для Systick выглядит правильно
3- Если прерывания снова включаются правильно.

РЕДАКТИРОВАТЬ:
Эта линия выглядит странно для меня, я не могу понять это: 080037B0 4B03 LDR R3, [0x080037C0]

Пито
Чт 05 января 2017 г. 15:45
: ugeek: : ugeek: : ugeek: : ugeek: : ugeek: : ugeek: : ugeek:

Я решил разделить Helloworld в приложение HelloToggle (Intrpts in Loader, включенные, Flash и Clock Inits in init () прокомментированы, вектор в досках до 0x68..): // HelloToggle APP for EXRAM // Pito 01/2017 :) // It Works !!! void setup() { int i; pinMode(PC13, OUTPUT); digitalWrite(PC13, HIGH); for (i = 0; i < 20; i++) { digitalWrite(PC13, LOW); digitalWrite(PC13, HIGH); } digitalWrite(PC13, HIGH); } void loop() { }

victor_pv
Чт, 05 января 2017 г., 17:37
: D
Таким образом, код успешно работает от RAM FSMC, с чем -то не так с прерывами или сиськой.
Вероятно, это связано с тем фактом, что ядро ​​предназначено для создания кода, который выполняется после сброса, поэтому инициализация всего, в то время как мы используем его для генерации кода, который вызывается из другой программы.

Возможно, после некоторого отдыха мы сможем посмотреть на это ;)
Я думаю, что объективная, которая должна была иметь возможность запускать код в RAM FSMC, был достигнут.

Пито
Чт, 05 января 2017 г., 18:21
Hellotoggle бежит от внешней оперативной памяти (SRAM 256KX16, 10NS, время D1, A0) Все разделы в Exram (векторы, текст, данные, BSS, куча, стек):
Hellotoggle.jpg
Hellotoggle.JPG (65.47 киб) просмотрено 302 раз

victor_pv
Чт, 05 января 2017 г., 8:41 вечера
Мне нужно что -то собрать для STM32 и проверить это :)

Пито
Чт, 05 января 2017 г. 20:56
Да, озон работает нормально, отличный инструмент. Единственная интеграция - это .Файл эльфи. Это здорово, но не для Arduino Ide.
Версия для загрузки включает в себя файлы SVD для 103xx и 407, что и хорошо, чтобы иметь.
Легко настроить и использовать. Я начал с него за 10 минут включающего поиск компоновки SWD штифта J-Link Blackbox заголовок. В мире есть 2 картины с правильным видом :)
Озон с Arduino IDE- это означает, что вы должны вспомнить номера телефонов папков Arduino Build с .Эльф -файл - он меняется каждый раз, когда вы закрываете эскиз.. Итак, с тем же эскизом вы должны редактировать путь на .Источник эльфа все время, иначе Озон не найдет .эльф.
Хорошая функция IDE - мне это нравится :(
Есть ли исправление для того, чтобы заставить IDE не удалять папку сборки и не переименовать ее в? Мне кажется, что было что -то давно назад..
PS: Хорошо, это не так гладко, как кажется. Я потратил еще 10 минут на поиск счетчика «истешенных циклов/времени». После этого я узнал, что счетчик cpucycles редактируется, так что вы можете ее ноль :). Мне нравится графический интерфейс озона.

Пито
Пт 06 января 2017 10:44
VTOR находится на 0xe000ed08 - это то, что показывает озон, нося в Exram (VTOR не установлен в загрузчике):
Vtor.jpg
Визит.JPG (39.16 киб) просмотрено 275 раз

Пито
Пт, 6 января 2017 г. 13:52
С отключенными интрат и отключенными Systick и VTOR = 0x68.. Перед прыжком в Exram - и с задержкой (3) и задержкой (2) в «Весел», он переходит в первую задержку ().
Delayloop.jpg
DelayLoop.JPG (24.19 киб) просмотрено 266 раз

victor_pv
Пт, 6 января 2017 г. 14:36
Пито написал:VTOR находится на 0xe000ed08 - это то, что показывает озон, нося в Exram (VTOR не установлен в загрузчике): Визит.JPG

Пито
Пт, 6 января 2017 г. 15:19
Итак, в соответствии с этим, мы не можем иметь таблицу NVIC в SRAM, поскольку она выходит из достоверного диапазона. Я думаю, что самым простым решением было бы перенести его во внутреннюю оперативную память, прежде чем снова включить прерывания. Это сложно :)
Когда смещение измеряется с memory_base («нижняя часть карты памяти»), что в случае «кода» составляет 0, а в случае «sram» = 0x60000000, вы можете поместить векторную таблицу в SRAM. Также бит t = 1 для "sram" устанавливает MSB смещения [29..7].
Банк SRAM запускается 0x60000000, и он составляет 4x64MB = 256 МБ длиной.
Мой Exram от Region3 (третий квартал 64 МБ от SRAM Bank), поэтому он начинается 0x68..
FSMC предлагает 4 фиксированные чипсы для регионов SRAM под названием NE1,2,3,4 (с началом SRAM регионы 0x60.., 0x64.., 0x68.., 0x6c..).
Итак, мое текущее понимание - когда карта нижней памяти SRAM начинается с 0x60.. вектор = 0x68000000 может работать ..

Рик Кимбалл
Пт, 6 января 2017 г. 15:31
Биты 31 и 30 игнорируются ... и как и нижние 9 битов ...

(GDB) P/x ~ (0B11 << 30 | 0b111111111)
$ 2 = 0x3ffffe00

это самый большой адрес, который можно использовать.

Когда вы установите его на 0x68000000, он становится с этим значением, и результат - это место в космосе ...

(GDB) P/x ~ (0B11 << 30 | 0b111111111) & 0x68000000
$ 3 = 0x28000000

Вы не можете поместить VTOR на внешнюю оперативную память.

-рик

victor_pv
Пт 06 января 2017 г. 16:30
Пито написал:Итак, в соответствии с этим, мы не можем иметь таблицу NVIC в SRAM, поскольку она выходит из достоверного диапазона. Я думаю, что самым простым решением было бы перенести его во внутреннюю оперативную память, прежде чем снова включить прерывания. Это сложно :)
Когда смещение измеряется с memory_base («нижняя часть карты памяти»), что в случае «кода» составляет 0, а в случае «sram» = 0x60000000, вы можете поместить векторную таблицу в SRAM. Также бит t = 1 для "sram" устанавливает MSB смещения [29..7].
Банк SRAM запускается 0x60000000, и он составляет 4x64MB = 256 МБ длиной.
Мой Exram от Region3 (третий квартал 64 МБ от SRAM Bank), поэтому он начинается 0x68..
FSMC предлагает 4 фиксированные чипсы для регионов SRAM под названием NE1,2,3,4 (с началом SRAM регионы 0x60.., 0x64.., 0x68.., 0x6c..).
Итак, мое текущее понимание - когда карта нижней памяти SRAM начинается с 0x60.. вектор = 0x68000000 может работать ..

victor_pv
Пт 06 января 2017 г. 16:31
Рик Кимбалл написал:Биты 31 и 30 игнорируются ... и как и нижние 9 битов ...

(GDB) P/x ~ (0B11 << 30 | 0b111111111)
$ 2 = 0x3ffffe00

это самый большой адрес, который можно использовать.

Когда вы установите его на 0x68000000, он становится с этим значением, и результат - это место в космосе ...

(GDB) P/x ~ (0B11 << 30 | 0b111111111) & 0x68000000
$ 3 = 0x28000000

Вы не можете поместить VTOR на внешнюю оперативную память.

-рик

Пито
Пт, 6 января 2017 г. 16:34
Смещение = 0x68000000 - 0x60000000 = 0x08000000

R - зарезервирован
T = 1 для SRAM
o - смещенные биты 29..7
VTOR rrTo oooo oooo orrr rrrr 0000 1000 0000 0000 0000 = 0x08000000 0010 1000 0000 0000 0000 = ofset for 0x68000000

Рик Кимбалл
Пт 06 января 2017 г. 16:36
victor_pv написал:Рик, я понял, что нижние 7 бит игнорируются, от 6 до 0, вы уверены, что это 9 бит?

victor_pv
Пт, 6 января 2017 г. 16:40
Рик Кимбалл написал:victor_pv написал:Рик, я понял, что нижние 7 бит игнорируются, от 6 до 0, вы уверены, что это 9 бит?

Пито
Пт, 6 января 2017 г. 16:47
:) И есть как минимум 2 еще одну руку CM3 Reffman описания VTOR на странице ARM.
Хорошо, это STM32F103XX ONE из вышеуказанного STM Refmman: Bits 31:30 Reserved, must be kept cleared Bits 29:9 TBLOFF[29:9] : Vector table base offset field. It contains bits [29:9] of the offset of the table base from memory address 0x00000000. When setting TBLOFF, you must align the offset to the number of exception entries in the vector table. The minimum alignment is 128 words. Table alignment requirements mean that bits[8:0] of the table offset are always zero. Bit 29 determines whether the vector table is in the code or SRAM memory region. 0: Code 1: SRAM Note: Bit 29 is sometimes called the TBLBASE bit. Bits 8:0 Reserved, must be kept cleared

Пито
Пт, 6 января 2017 г., 17:59
Мы можем поместить векторный стол в Ирам, как предложил Виктор.
1. Размер IRAM будет установлен на 1K меньше в линкере Loader, IRAM_VT начнется по адресу 0x2000FC00 - Нижние 9 бит раны 0.
2. После того, как FMSC жив в start_c.C мы копируем диапазон [0x68000000 .. end_of_the_vector_table] к [iram_vt .. Iram_vt+vector_table_size] as-is
3. Мы устанавливаем VTOR перед прыжком в приложение на 0x2000fc00
Это правильно?
PS:
2. Мы можем скопировать векторную таблицу из эскиза загрузчика.. это может работать.. Так что никаких изменений в start_c.C требуется. Я собираюсь попробовать :)
РЕДАКТИРОВАТЬ: Исправлена ​​адресаса

victor_pv
Пт, 6 января 2017 г. 18:15
Пито написал:Мы можем поместить векторный стол в Ирам, как предложил Виктор.
1. Размер IRAM будет установлен на 1K меньше в линкере Loader, IRAM_VT начнется на 0xfc00 - нижние 9 битов раны 0.
2. После того, как FMSC жив в start_c.C мы копируем диапазон [0x68000000 .. end_of_the_vector_table] к [iram_vt .. Iram_vt+vector_table_size] as-is
3. Мы устанавливаем VTOR перед прыжком в приложение на 0xfc00
Это правильно?
PS:
2. Мы можем скопировать векторную таблицу из эскиза загрузчика.. это может работать.. Так что никаких изменений в start_c.C требуется. Я собираюсь попробовать :)

Пито
Пт 06 января 2017 г. 20:37
После копирования VT из XRAM в IRAM, начиная с 0x2000FC00 (с Top MEM 60K в линкере), и осматривая весь IRAM на результатах, я вижу следующее:
1. После сброса загрузчик начинает заполнять адреса от 0x20000000 с помощью VT, где векторы все похожи на 0x08xxxxx.
Я могу пройти через загрузчик, поэтому я вижу, что он заполняет
2. Когда я бегаю до следующей точки остановки - BP в самом начале эскиза загрузчика, BP помещается до того, как я сделаю копирование .корзин для exram или копирование VT в Ирам (или я тоже прокомментировал это), я могу видеть следующим образом:
Mem1.jpg
Мем1.JPG (109.87 киб) просмотрено 288 раз

Рик Кимбалл
Пт, 6 января 2017 г., 8:49 вечера
Я думаю, вам нужно загрузить векторную таблицу на 0x20000000, чтобы все это работало

victor_pv
Пт, 6 января 2017 г., 21:28
Пито написал:После копирования VT из XRAM в IRAM, начиная с 0x2000FC00 (с Top MEM 60K в линкере), и осматривая весь IRAM на результатах, я вижу следующее:
1. После сброса загрузчик начинает заполнять адреса от 0x20000000 с помощью VT, где векторы все похожи на 0x08xxxxx.
Я могу пройти через загрузчик, поэтому я вижу, что он заполняет
2. Когда я бегаю до следующей точки остановки - BP в самом начале эскиза загрузчика, BP помещается до того, как я сделаю копирование .корзин для exram или копирование VT в Ирам (или я тоже прокомментировал это), я могу видеть следующим образом: Мем1.JPG

Пито
Пт, 6 января 2017 г., 21:29
@Rick:
Кто -то загружает VT векторами Exram до 0x20000000, но я не знаю, кто. Это должно быть решено сначала - см. Мой предыдущий пост :)
Кстати, когда он кратко играл с приложением, в то время как VT на 2000FC00 и VTOR = 2000FC00 Результат был отрицательным - без сисцикла.
Но сначала я должен понять, кто заполняет 0x6x.. векторы до 0x20000000 :) :)
МОЙ БОГ!

Пито
Пт, 6 января 2017 г., 21:32
@Victor: я храню это в мусорном ведре.час unsigned char bin[] = { 0x00, 0xf8, 0x07, 0x68, 0xc9, 0x01, 0x00, 0x68, 0x91, 0x04, 0x00, 0x68, 0x95, 0x04, 0x00, 0x68, 0x99, 0x04, 0x00, 0x68, 0x9d, 0x04, 0x00, 0x68, 0xa1, 0x04, 0x00, 0x68, 0xf1, 0x04, 0x00, 0x68, 0xf1, 0x04, 0x00, 0x68,

victor_pv
Пт, 6 января 2017 г., 21:35
Пито написал:@Victor: я храню это в мусорном ведре.час unsigned char bin[] = { 0x00, 0xf8, 0x07, 0x68, 0xc9, 0x01, 0x00, 0x68, 0x91, 0x04, 0x00, 0x68, 0x95, 0x04, 0x00, 0x68, 0x99, 0x04, 0x00, 0x68, 0x9d, 0x04, 0x00, 0x68, 0xa1, 0x04, 0x00, 0x68, 0xf1, 0x04, 0x00, 0x68, 0xf1, 0x04, 0x00, 0x68,

Пито
Пт, 6 января 2017 г., 21:44
data.jpg
данные.JPG (63.61 киб) просмотрено 543 раза

Рик Кимбалл
Пт, 6 января 2017 г., 21:53
Вы должны установить свой Boot0 = 1 и Boot1 = 1, установите код для хранения таблицы ISR_VECTER по телефону 0x20000000 ...
Когда процессор сбрасывает его отображение от 0x20000000 до 0x0 ... 0x0: 0x20005000 (gdb) 0x4: 0x20000109 (gdb) x/i *0x4 0x20000109 <__vector_table+265>: ldr.w pc, [pc, #-264] ; 0x20000004 <__vector_table+4>

victor_pv
Пт 06 января 2017 г. 22:02
Пито написал:данные.JPG

Пито
Пт 06 января 2017 22:11
На этом этапе я ни в чем не уверен :)
Я буду двойной, но я думаю, что загрузчик составлен для оригинального VTOR.
Новый вывод:
1. Я установил VTOR на 0x2000FC00 в загрузке, я вижу его по адресу VTOR правильно
2. Я прыгаю к приложению, некоторое время шагаю, VTOR держит
3. Затем я бегаю до BP, который устанавливается в начале первой задержки (3) петли
4. Когда он останавливается на этом BP, VTOR изменяется на 0x08002000..
Я должен проверить настройки VTOR для сборки приложения..

Это меняет мой VTOR: /** * @brief Initialize the NVIC, setting interrupts to a default priority. */ void nvic_init(uint32 address, uint32 offset) { 680006f8: b510 push {r4, lr} * @param offset Offset from address. Some restrictions apply to the * use of nonzero offsets; see the ARM Cortex M3 * Technical Reference Manual. */ void nvic_set_vector_table(uint32 address, uint32 offset) { SCB_BASE->VTOR = address | (offset & 0x1FFFFF80); 680006fa: 6098 str r0, [r3, #8] <<<<<<<<<<<<<<<<<<<<<<< HERE

Пито
Сб 07 января 2017 г. 12:12
При вставке правильного адреса VTOR вручную через отладчик (см. Выше вопрос - init () портит мой VTO : ugeek: : ugeek: : ugeek: : ugeek: : ugeek: и светодиодные переключения. Усталый..
2msecs задержка.jpg
Задержка 2 мс.JPG (24.43 киб) просмотрено 531 раза

Пито
Сб 07 января 2017 г. 7:52 утра
В STM32F1 \ Cores \ Maple \ libmaple \ nvic.C Commond Out для сборки Exram: void nvic_set_vector_table(uint32 address, uint32 offset) { // SCB_BASE->VTOR = address | (offset & 0x1FFFFF80); }

Пито
Сб 07 января 2017 г. 8:57 утра
Теперь сложная часть - сериал над USB в Exram :) :)
Это эскиз, который мигает в отладчике (он идет через серийные вызовы, но я не вижу Hellow Chars в терминале Teraterm, погрузчики отпечатывают ОК, прежде чем прыгать в приложение в Exram).
Он пробирается в одиночку (от отладчика), и я не вижу Хелоу Чарс в терминале Тертерма. Погрузчик печатает ОК перед прыжком в приложение в Exram.
Вариант с ожиданием проведенных циклов в отладчике вокруг. void setup() { int i; pinMode(PC13, OUTPUT); digitalWrite(PC13, HIGH); delay(5000); Serial.begin(115200); //while(!Serial.isConnected()){}; Serial.println("Hello World from EXRAM!"); Serial.println("Now we blink 17x.."); for (i = 0; i < 17; i++) { digitalWrite(PC13, LOW); delay(500); digitalWrite(PC13, HIGH); delay(500); } digitalWrite(PC13, HIGH); Serial.println("Blinking stopped.."); } void loop() { }

Пито
Сб 07 января 2017 г. 11:14
Хорошо, позвольте мне попробовать с serial1 :)
COM22 - это серийный USB от загрузчика, он распечатывает 8+8 байтов из приложений в Exram, чтобы проверить работы FSMC, и приложение было загружено в Exram, COM5 является последовательным 1 из эскиза HelloWorld, как выше, работающий в Exram.
:) :) :) :) : ugeek: : ugeek: : ugeek: : ugeek: :) :) :) :)
Helloworld от exram.jpg
Helloworld от Exram.JPG (29.43 киб) просмотрено 500 раз

Пито
Сб 07 января 2017 г. 11:40
Сортировка пузырьков на 3000 случайных типов различных типов, выделенных malloc (), все, кроме векторной таблицы в Exram.
Vt в 0x2000ffc0 в зарезервированном IRAM (зарезервировано таковому погрузчику IRAM заканчивается в линкере -4 КБ, чтобы быть в безопасности :) ).
STM32F103ZET6 @72MHZ, SRAM 256KX16, 10NS, FSMC TIMING D1, A0.
Bubblesort in exram.jpg
Bubblesort в Exram.JPG (144.29 киб) просмотрено 499 раз

Martinayotte
Сб, 07 января 2017 г. 15:28
Пито написал:6. CP/Mduino :)

Пито
Сб, 07 января 2017 г. 20:12
Мне нравится ретро :)

Еще несколько тестов (из нити этого форума Dhrystone и Whetstone Clardmars для STM32F103, первого сообщения), для избежания любого сомнения первые результаты от IRAM: Starting Whetstone benchmark... Loops: 1000Iterations: 1Duration: 20366 millisec. C Converted Double Precision Whetstones: 4.91 MIPS Starting Whetstone benchmark... Loops: 1000Iterations: 1Duration: 179589 millisec. C Converted Double Precision Whetstones: 556.83 KIPS

victor_pv
Солнце 08 января 2017 13:12
USB-порт, как он кодируется в ядре, должен отключиться и восстановить подключение при включении платы (загрузчик загрузчика), когда загрузчик прыгает на эскиз (код инициализации эскиза вызывает отключение, восстановление и ПК повторно разместите порт), и то же самое должно произойти, когда вы прыгаете с погрузчика на эскиз Exram.
Вполне возможно, что часть, которая инициализирует серийный USB, вызывается из одной из функций, которые мы отключили, вероятно, от SetupClock ()
Также возможно, что отключение не достаточно долго для обнаружения Windows. В другой теме, который Роджер упомянул, он немного продлил это время, потому что у некоторых людей были проблемы с перечислением.

Если я правильно понимаю, вы сначала копируете таблицу NVIC в int ram, а затем устанавливает значение VTOR, это правильно?
Вы делаете это в main () или в эскизе (setup () или loop ())?

Пито
Солнце 08 января 2017 13:24
При процессоре 128 МГц, запуская все в Exram (SRAM Settings D1, A0): Dhrystone Benchmark, Version 2.1 (Language: C) Execution starts, 300000 runs through Dhrystone Execution ends Microseconds for one run through Dhrystone: 57.35 Dhrystones per Second: 17437.22 VAX MIPS rating = 9.92 ***

Rogerclark
Солнце 08 января 2017 8:25 вечера
@pito

Чтобы загрузить эскиз в Exram, вы можете написать несколько эскизов, чтобы принять загрузки через сериал, используя протокол STM32-Flash, который использует внутренний загрузочный загрузчик.

Это позволило бы вам просто сбросить плату (которая запустит эскиз загрузчика), а затем просто установите IDE на использование метода последовательной загрузки.

Протокол довольно прост и хорошо задокументирован ST, а также у нас есть загрузчики C и Python в качестве ссылки.

В их репо также есть ветвь загрузчика Leaflabs, который загружается с использованием этого протокола (в Leaflabs Github Repo) . Обратите внимание, я не знаю, работает ли этот загрузчик на самом деле, потому что я никогда не пробовал это ;-)

Вы даже можете добавить что -то в протокол E.G, чтобы установить имя файла, чтобы вы могли хранить в SD и получить позже.

victor_pv
Солнце 08 января 2017 22:05
Пито, я согласен с идеей Роджера может быть интересной. Также загрузка с SD -карты. Вы даже можете заставить загрузчик показать меню на сериале или ЖК -экране, показывающий, что .Файлы корзины находятся на SD -карте и дают пользователю выбор, чтобы выбрать один.

Теперь о возвращении к загрузке, я думал о возможном способе, но есть много "если"...
Я добавляю индексы, чтобы помочь при ссылке, не обязательно это шаги, и они идут в этом порядке:

1.Во -первых, мы знаем, что стек из погрузчика и стек из приложения не перекрывается, поскольку один находится в Ираме, а другой в Exram, поэтому мы не обеспокоены тем, что стек загрузчиков.
2.Прямо перед загрузкой приложения мы изменим указатель стека на Exram One.
3.Далее мы называем приложение (компьютер должен быть сохранен в стеке автоматически, разве это не так ли?) Рик знает больше, как работают внутренние значения этого MCU, поэтому он может помочь в этом.
4.Если ПК сохраняется автоматически при вызове приложения, то первая запись в верхней части нового стека - это точка возврата, чтобы вернуться к эскизу загрузчика.
4B. Если это не так, мы могли бы прочитать ПК перед вызовом кода пользователя, добавьте столько байтов, сколько необходимо, чтобы получить правильный адрес возврата, а затем сохранить его в верхнюю часть нового стека, прежде чем вызовать код приложения.
5.Приложение могло выйти, просто позвонив по адресу, сохраненный в верхней части стека Exram. Это известный адрес, поэтому нам даже не нужно заботиться о том, что еще в этом стеке уже, только чтение первой записи и прыжки с ним, надеюсь, будет достаточно.
6.Если мы сможем вернуться обратно в загрузчик, мы должны быть в состоянии вернуть в точку регистра SP обратно в нижнюю часть стека загрузчиков (помните точку 2 выше, мы перезаписываем SP с верхней частью стека Exram). Чтобы сделать это, я думаю, что мы должны сохранить стек с переменной Uint32 прямо перед точкой 2, то есть прямо перед тем, как переучить его со стеком Exram. Затем за инструкцией после перехода к функции приложения должна последовать инструкция, которая считывает значение из этой переменной, и записывать ее в SP, и загрузчик может продолжать работать как обычно.

Кто -нибудь видит какой -либо недостаток в этом процессе?

Пито, я думаю, вы можете проверить, сохранен ли возвратный ПК в верхней части нового стека с отладчиком, поместив точку останова прямо в начале приложения и проверив верхнюю часть содержимого стека, справа?

Rogerclark
Солнце 08 января 2017 22:59
Виктор

Я предполагал, что Pito, должно быть, уже обрабатывал стек и т. Д. Перед прыжком к коду приложения, так как эскиз должен копировать приложение из его статического массива в Flash, прежде чем он прыгнет

Возвращение назад может быть немного сложным, так как вам нужно было восстановить все регистры и т. Д., Поскольку приложение оставило их в некотором неизвестном состоянии.

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

victor_pv
Пн, 09 января 2017 г. 1:55
Rogerclark написал:Виктор

Я предполагал, что Pito, должно быть, уже обрабатывал стек и т. Д. Перед прыжком к коду приложения, так как эскиз должен копировать приложение из его статического массива в Flash, прежде чем он прыгнет

Возвращение назад может быть немного сложным, так как вам нужно было восстановить все регистры и т. Д., Поскольку приложение оставило их в некотором неизвестном состоянии.

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

Rogerclark
Пн, 09 января 2017 г., 4:38 утра
Виктор

Я думаю, что «завершение» функции потребуют, чтобы все регистры были выдвинуты в стек перед прыжком к приложению, а также к ПК необходимо было бы натолкнуть на стек приложений, чтобы приложение было знанием, куда прыгнуть обратно.

Пито
Пн, 09 января 2017 г. 9:02 утра
@Roger, загрузка приложений в ExRAM непосредственно из IDE хороша для тестирования основной функциональности ExRAM, но для фактического использования я думаю не так много, потому что Exram нестабильный.
Таким образом, единственный способ, которым люди хотели бы ИМХО, - это использовать средства массовой информации, подключенные к MCU для хранения двоичных файлов, то есть SDCARD, внутренняя вспышка, внешняя вспышка, USB Flash, Punch Tape :)

Возвращение к Xloader из приложения Exram жизненно важно, поэтому он должен быть решен с помощью экспертов здесь, Как тогда вы можете создать Xloader (я не хочу называть его «ОС», так как это может произойти, меня здесь будут запрещены :) ), который при подключении к SDCARD через SDFAT будет перечислять, например: Hello Roger from xLOADER v3.12 ! > dir 24567 APPs found APP1.bin APP2.bin ... .. APP24567.bin > run APP3.bin Hello World from EXRAM!!! > run APP2238.bin Whetstone.. > date 2017 01 09 > time 10:02 AM >

Пито
Пн, 09 января 2017 г. 9:34
Вот Xlugleer v1.01 // THE xLOADER v1.01 // // LOADS an USER APP binary into the EXRAM and RUNS the APP off the EXRAM // The APP must fit into EXRAM (text, data, bss, heap, stack) // The bin.h includes the APP.bin in form of (for example): // // static const unsigned char bin[] = { // 0x00, 0xf8, 0x07, 0x68, 0x39, 0x06, 0x00, 0x68, 0x91, 0x09, 0x00, 0x68, // 0x95, 0x09, 0x00, 0x68, 0x99, 0x09, 0x00, 0x68, 0x9d, 0x09, 0x00, 0x68, // .. // 0xb8, 0x52, 0x00, 0x68, 0x78, 0x4d, 0x00, 0x68 // }; // unsigned int bin_len = 25844; // // The bin.h could be generated from APP.bin by a tool called "xxd" // // More info at stm32duino forum // No warranties of any kind. Provided as is. Use at your own risk. // by Pito January 8th 2017 // #include "bin.h" __attribute__( ( always_inline ) ) static inline void __set_CONTROL(uint32_t control) { __asm volatile ("MSR control, %0" : : "r" (control) : "memory"); } __attribute__( ( always_inline ) ) static inline void __set_MSP(uint32_t topOfMainStack) { __asm volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); } typedef void (*pFunction)(void); #define ApplicationAddress ((uint32_t)0x68000000) #define __IO volatile pFunction Jump_To_Application; __IO uint32_t JumpAddress; // Start of FSMC SRAM BANK 1, REGION 3 static uint8 *const sram_start8 = (uint8*)0x68000000; #define EXRAM8(x) (*(sram_start8+x)) // Start of the APP Vector Table in IRAM static uint8 *const iram_VT = (uint8*)0x2000FC00; #define IRAMVT(x) (*(iram_VT+x)) void nvicDisableInterrupts() { NVIC_BASE->ICER[0] = 0xFFFFFFFF; NVIC_BASE->ICER[1] = 0xFFFFFFFF; NVIC_BASE->ICPR[0] = 0xFFFFFFFF; NVIC_BASE->ICPR[1] = 0xFFFFFFFF; /* disable the systick, which operates separately from nvic */ systick_disable(); } void setup() { Serial1.begin(115200); // wait on USB // while(!Serial.isConnected()){}; int i; uint32 elapsed = micros(); // copy the APP.bin into the EXRAM for (i = 0; i < bin_len; i++) { EXRAM8(i) = bin[i]; } elapsed = micros() - elapsed; Serial1.print("Loading the APP.bin took "); Serial1.print(elapsed); Serial1.print(" usecs"); Serial1.println(" "); // print out first 8 and last 8 bytes of the APP binary stored in EXRAM for a check // if the FSMC does not work properly, the "FF"s will be returned for (i = 0; i < 8; i++) { Serial1.print(i); Serial1.print(" "); Serial1.println(EXRAM8(i), HEX); } for (i = bin_len - 8; i < bin_len; i++) { Serial1.print(i); Serial1.print(" "); Serial1.println(EXRAM8(i), HEX); } // copy the APP Vector_Table to IRAM (ie. starting from 0x2000FC00) for (i = 0; i < 512; i++) { IRAMVT(i) = bin[i]; } Serial1.println("Starting the APP.bin:"); delay(10); // wait till Serial prints all the chars out /* jump to USER APP code loaded in EXRAM memory and execute it!! */ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; nvicDisableInterrupts(); // set the new VTOR *(int volatile*)0xE000ED08 = (volatile uint32_t) 0x2000FC00; /* initialize USER APP Stack Pointer */ __set_CONTROL(0); // Change from PSP to MSP __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); } void loop() { }

Rogerclark
Пн, 09 января 2017 г. 9:39
@pito

Редактировать. Я только что заметил, что вы опубликовали, пока я писал это. Так что я еще не читал твой код.



Я знаю, что Exram нестабилен, поэтому я предполагал, что вы хотите сохранить код приложения на SD -карте, а затем загрузить в любое приложение, которое у вас есть на SD.

Моя мысль также заключалась в том, что вам понадобится простой способ создать приложение, в IDE и загрузить его на доску (для доски для хранения в Exram, а также в SD), или, возможно, прямо на SD, а затем загрузить Exram от SD позже.


Во всяком случае, вернемся к возвращению от прыжка к приложению в Exram:

Я думаю...

Чтобы вернуться, вам нужно будет протолкнуть все регламента на стек, затем переключить стек на стек Exram и сделать другую настройку E.глин. Таблица VTOR, а затем, нажмите обратный адрес (PC + X) на стек Exram, и они прыгают в начало приложения Exram

Когда приложение завершится, вам нужно будет вытащить обратный адрес обратного адреса из стека Exram, а затем прыгнуть в это место.
Основной код затем должен восстановить его разматывание, изменить адрес стека и восстановить регистры из стека и т. Д

Стивестронг
Пн, 09 января 2017 г. 9:48 утра
Точно так же, как непрофессионал для возврата из RAM App, чтобы Flash: не будет обработан автоматически процессором при возвращении из Jump_To_Application();

Пито
Пн, 09 января 2017 г. 10:01
Также пользовательское приложение обычно заканчивается бесконечным циклом.. Или мы можем остановить это с помощью ctrl_q, например, ?? :)
Позвольте на некоторое время думать.
Будут приветствовать образцы кода. Но лучше, когда у вас есть доска с SRAM на ней. Переносить на другую доску легко (когда вы сделали это один раз :) )
Обычно такое упражнение заканчивается тем, что называется ** ядро ​​IX :) :)
Но на 2017 год позвольте нам поставить цель создать Xloader, который может загружать/запустить/перезагрузить/повторить сохраненные приложения SDCARD на основе очень простой «интерпретатор командной строки», как показано выше.. Воскресное упражнение, когда мы делаем возвращение из приложения, работающего в Exram обратно в CLI (интерпретатор командной строки)..

Вот руководство - короткое вступление, которое мы можем медленно усилить http: // www.STM32duino.com/viewtopic.PHP ... 100#P22119

Стивестронг
Пн, 09 января 2017 г. 10:31
Пито написал:Также пользовательское приложение обычно заканчивается бесконечным циклом.. Или мы можем остановить это с помощью ctrl_q, например, ?? :)

Пито
Пн, 09 января 2017 г. 10:57 утра
К вашему сведению - я нашел в своей нежелательной коробке от некоторых старых проектов:
1mx16 10ns
mem2mb.jpg
mem2mb.JPG (7.6 киб) просмотрено 436 раз

Пито
Пн, 09 января 2017 г., 11:48
Обновил Xloader to v1.01 - добавлено измерение времени нагрузки. Теперь вы увидите что -то вроде: Loading the APP.bin took 7490 usecs 0 0 1 F8 2 7 3 68 4 39 5 6 6 0 7 68 25836 B8 25837 52 25838 0 25839 68 25840 78 25841 4D 25842 0 25843 68 Starting the APP.bin: Dhrystone Benchmark, Version 2.1 (Language: C) Execution starts, 300000 runs through Dhrystone Execution ends Microseconds for one run through Dhrystone: 57.41 Dhrystones per Second: 17418.90 VAX MIPS rating = 9.91 ***

Пито
Пн, 09 января 2017 12:27
Exram_guide_1.jpg
Exram_guide_1.JPG (94.52 киб) просмотрено 540 раз

victor_pv
Пн, 09 января 2017 г. 16:45
Стивестронг написал:Точно так же, как непрофессионал для возврата из RAM App, чтобы Flash: не будет обработан автоматически процессором при возвращении из Jump_To_Application();

Пито
Пн, 09 января 2017 г., 17:09
Не беспокойтесь, Виктор, навыки рисования не важны на этом этапе :)
Было бы здорово, если бы вы сможете имитировать прыжок на своем доске.
XLoader с SDFAT будет составлять около 38 КБ вспышке и IRAM 6 КБ (получен из примера ReadCSV).
Наименьшее приложение, которое я построил - переключать булавку - это 15 кб :) 30y назад я сделал это с 15..

victor_pv
Пн, 09 января 2017 г., 17:29
Пито написал:Не беспокойтесь, Виктор, навыки рисования не важны на этом этапе :)
Было бы здорово, если бы вы сможете имитировать прыжок на своем доске.
XLoader с SDFAT будет составлять около 38 КБ вспышке и IRAM 6 КБ (получен из примера ReadCSV).
Наименьшее приложение, которое я построил - переключать булавку - это 15 кб :) 30y назад я сделал это с 15..

Пито
Пн, 09 января 2017 г. 18:56
Кстати, я купил эту доску 407Zet http: // www.eBay.com/itm/stm32f407zet6-s ... SWXG5XYT1Q (Подушки SRAM и гнездо SDCARD с нижней стороны) 4 декабря, и с 5 декабря плата находится в воздухе, согласно трекеру посылки :)

victor_pv
Вт 10 января 2017 г. 12:17
Нашел это сегодня:
https: // www.aliexpress.com/item/2pcs-is ... 77141.HTML

Пито
Вт 10 января 2017 г. 5:48 утра
Воспоминания о Шраме: ! Всегда дважды проверяйте с продавцом и/или таблицей данных, это 3.3V память.
Напряжение памяти (5 В или 3.3v) обычно отличается на основе 1-2 различных букв в имени детали (иногда буква после приборной панели). Даже у крупных поставщиков есть проблемы, чтобы отличить..

ZMEMW16
Вт 10 января 2017 г. 14:32
Пито написал:Кстати, я купил эту доску 407Zet http: // www.eBay.com/itm/stm32f407zet6-s ... SWXG5XYT1Q (Подушки SRAM и гнездо SDCARD с нижней стороны) 4 декабря, и с 5 декабря плата находится в воздухе, согласно трекеру посылки :)

Пито
Ср 11 января 2017 12:44
Это контрольный показатель SDFAT от Exram.
Плата Bluezex с прикрепленным гнездом SDCARD, @72MHZ, SPI1 @36 МГц, в Exram.
Посмотрите на сообщение бесплатного стека : шок: Loading the APP.bin took 15829 usecs 0 0 1 F8 2 7 3 68 4 A1 5 2C 6 0 7 68 39264 20 39265 28 39266 30 39267 38 39268 A0 39269 7F 39270 0 39271 68 Starting the APP.bin: Use a freshly formatted SD for best performance. Type any character to start FreeStack: 472455 Type is FAT32 Card size: 8.03 GB (GB = 1E9 bytes) Manufacturer ID: 0X1B OEM ID: SM Product: 00000 Version: 1.0 Serial number: 0X8C5663D3 Manufacturing date: 6/2015 File size 5 MB Buffer size 8192 bytes Starting write test, please wait. write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1140.37,96194,5806,7164 1048.93,96772,5814,7789 1073.26,97157,5812,7612 1065.48,96412,5814,7668 1098.51,96416,5810,7439 1078.13,97167,5821,7579 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 856.26,11804,9471,9559 856.40,10969,9472,9556 856.40,11138,9477,9556 856.40,10954,9451,9556 856.40,11139,9475,9557 856.55,11133,9473,9556 Done Type any character to start

Пито
Ср 11 января 2017 г. 15:30
ZMEMW16 написал:..
Этот варьировался от 11 фунтов стерлингов.От 46 до 12 фунтов стерлингов.77
https: // www.aliexpress.com/item/free-sh ... 0.0.4i6xle

Кстати, есть немного меньший вариант PCB 407VET, нет прокладки SRAM внизу.

Дата заказа на доставку варьировалась от 18 до 33 дней

Стивен

ZMEMW16
Ср 11 января 2017 г., 17:57
Я положил плохую картину маленького на вики на некоторое время назад.
Если вы перейдите по ссылкам для приведенного ниже варианта, есть «Руководство пользователя», схемтик и пример кода.(Не уверен, какая доска)
Код, вероятно, для SPL и UVISION5 (??)

Резисторы 0603, намереваясь использовать гвоздь, удерживая один на месте, Tiddlywinks, найдите резистор

Стивен

Пито
Ср 11 января 2017 г., 19:29
Мой логист SDCARD с FIFO под Freertos - http: // www.STM32duino.com/viewtopic.PHP ... IFO#P19835
от Exram, выделенного ~ 260 КБ (10 тысяч записей) для буфера FIFO: Sketch uses 37,544 bytes (7%) of program storage space. Maximum is 524,288 bytes. Global variables use 296,496 bytes of dynamic memory.

Пито
Чт 12 января 2017 г. 10:26
Обновление: скамейка SDFAT, от Exram, F_CPU = 128M, SPI = 32 МГц
50% скорость с прочтением :) write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1073.50,97293,5571,7617 1131.34,96151,5570,7227 1157.28,96051,5570,7062 1061.64,96890,5570,7699 1086.09,96610,5570,7530 1108.75,96572,5570,7375 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1278.04,7996,5729,6405 1279.34,8089,5723,6396 1279.34,8081,5744,6399 1279.02,8081,5723,6400 1279.34,8103,5726,6401 1278.69,8741,5720,6401 Done Type any character to start

victor_pv
Чт 12 января 2017 13:27
Некоторое интересное чтение о рутинных звонках в руке:
http: // Infocenter.рука.com/help/topic/co ... /Atpcs.PDF

Я еще не закончил, но до сих пор я понимаю, что работа по сохранению SP и регистрации оставлена ​​под названием рутины, а не на вызов.
Поскольку с загрузчика, вызываемая подпрограмма - это код ассемблера запуска, сценарий линкера помещает в начале, и мы уже меняем SP, прежде чем позвонить, я думаю, что нам нужно вручную предоставить для сохранения его перед вызовом.
R0-R3 не нужно сохранять с помощью призванной рутины. Итак, нам нужно сделать это с погрузчика:
1. Сохраните R4-R11 в стек
2. Сохраните SP в известную позицию IRAM (должна работать просто переменная типа указателя).
3. Сохраните адрес возврата где -нибудь (Exram или Iram?).
4. Изменение sp
5. Вызовать приложение
----
6. (Адрес возврата, указывающий на эту инструкцию). Загружать SP из переменной на шаге 3.
7. POP R4-R11 из стека.
8. Перемена NVIC VTOR.
9. Включить прерывания

Из приложения, чтобы вернуться, мы должны:
1. Отключить прерывания.
2. Прочитайте адрес, сохраненный на шаге 3 выше.
3. Загрузите его на компьютер, который перенесет ПК на шаг 6.

Периферийное состояние будет неопределенным в этот момент. Специально периферийное устройство USB и любой другой, использующий буфер, так как адрес буфера, вероятно, был изменен, а также другие регистры конфигурации тоже.

РЕДАКТИРОВАТЬ: Чем больше я думаю об этом, тем больше я думаю, что лучше сбросить MCU, чтобы перезапустить программу во Flash, когда приложение будет закончено, как предложил Роджер, в противном случае есть слишком много вещей, чтобы контролировать.
Конечно, вы можете убедиться, что погрузчик и приложение не используют одинаковые периферийные устройства, поэтому периферийные устройства для погрузчика не изменили состояние при возврате, но это ограничивает то, что вы делаете. Кажется, лучше просто перезагрузить и позволить загрузке выбрать новое приложение.

victor_pv
Чт 12 января 2017 г. 13:30
Пито написал:Обновление: скамейка SDFAT, от Exram, F_CPU = 128M, SPI = 32 МГц
50% скорость с прочтением :) write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1073.50,97293,5571,7617 1131.34,96151,5570,7227 1157.28,96051,5570,7062 1061.64,96890,5570,7699 1086.09,96610,5570,7530 1108.75,96572,5570,7375 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1278.04,7996,5729,6405 1279.34,8089,5723,6396 1279.34,8081,5744,6399 1279.02,8081,5723,6400 1279.34,8103,5726,6401 1278.69,8741,5720,6401 Done Type any character to start

Пито
Чт 12 января 2017 г. 18:18
Jumpback от приложения через сброс может работать. С долгосрочной перспективы я бы проголосовал за механизм, как вы описали (хранить/восстановить контекст Xloader). Иногда причина в будущем вы можете решить, что «коммутатор контекста» может обрабатывать приложения..
В Big Oses ядро ​​изолируется из приложений пользователя физически, поэтому контекст ядра и приложение One сохраняется.
Мы можем согласиться, что единственный периферический XLugloer использует Serial1. Это консоль Xloader. У меня уже есть CL Parser, работающий в XLoader, я скоро буду обновлять Xloader.

victor_pv
Чт 12 января 2017 г., 19:17
Вам также нужен доступ к устройству хранения для загрузки приложения, например, SDCARD, USB Pendrive или что -то в этом роде. Обработчики могут быть закрыты и все, но добавляет немного больше сложности.

Пито
Чт 12 января 2017 г., 19:39
### Hello from xLOADER v1.02 ! ### Usage: help run APP1 test test1 param > help Usage: help run APP1 test test1 param > test This is the test.. > test1 hello1234 This is the test1.. Parameter: hello1234 > run DHRYSTONE Loading the DHRYSTONE took 8201 usecs 0 0 1 F8 2 7 3 68 4 39 5 6 6 0 7 68 25836 B8 25837 52 25838 0 25839 68 25840 78 25841 4D 25842 0 25843 68 Starting the DHRYSTONE ... Dhrystone Benchmark, Version 2.1 (Language: C) Execution starts, 300000 runs through Dhrystone Execution ends Microseconds for one run through Dhrystone: 57.35 Dhrystones per Second: 17437.23 VAX MIPS rating = 9.92 ***

Пито
Чт 12 января 2017 г., 21:25
Теперь мы читаем из файла, размещенного на SDCard. В этом случае dhrystone.бин.
Чтение из файла через 8192b большой буфер.
Нет мусорного ведра.H использовался больше, отлично !!! :)
РЕДАКТИРОВАТЬ: Добавлено DIR :) ### Hello from xLOADER v1.03 ! ### Usage: help dir run APP.bin > dir Root dir: Dhrystone.bin STM_Dhrystone128.ino.bin STM_HelloToggle_fromEXRAM.ino.bin STM_SDLOGGER_FreeRtos_FIFO__FIRFILTER.ino.bin STM_Whetstone.ino.bin STM_bench.ino.bin STM_BubbleSort_EXRAM_ALL.ino.bin STM_Dhrystone.ino.bin > run Dhrystone.bin Reading file.. Loading the Dhrystone.bin 25844 bytes large took 17531 usecs First 8 bytes in EXRAM: 0 F8 7 68 39 6 0 68 Starting the Dhrystone.bin ... Dhrystone Benchmark, Version 2.1 (Language: C) Execution starts, 300000 runs through Dhrystone Execution ends Microseconds for one run through Dhrystone: 57.35 Dhrystones per Second: 17437.23 VAX MIPS rating = 9.92 ***

Пито
Пт 13 января 2017 г. 3:08
Теперь настоящее чувство ретро -выписки - Мандельброт - Долина морской лошади.
Exram, 200x200 пикселей, конвертируется в .BMP -изображение, сохраняет .BMP на SDCARD.
Двойная точность рассчитана (я надеюсь на это..). Пытка для STM32 @128M.
Картирование цвета все еще дерьмо, но вы ощущаете восемьдесят, когда говорите о производительности.. ;) > run Mandelbrot.bin Reading file.. Loading the Mandelbrot.bin 32960 bytes large took 22997 usecs First 8 bytes in EXRAM: 0 F8 7 68 21 22 0 68 Starting the Mandelbrot.bin ... Allocated 120000 bytes for image buffer.. Mandelbrot starts.. Elapsed 837912 msecs Writing .bmp to SDcard.. Done..

Пито
Пт 13 января 2017 г. 9:51
То же самое при запуске от Flash, и только куча расположена в Exram, буфер с изображением через Malloc () в куче: Allocated 120000 bytes for image buffer.. Mandelbrot starts.. Elapsed 101974 msecs Writing .bmp to SDcard.. Done..

Пито
Солнце 15 января 2017 г. 9:52
Новый вариант v3:
1. Приложение запускает внутреннюю IRAM и использует кучу в Exram
2. ОЗУ xloader находится на вершине Ирама
3. Xloader работает как обычно с вспышки и загружает приложение в Iram (0x20000000).

Вы можете увидеть адреса VT ниже указывают на внутренний IRAM.
Dhrystone и Mandelbrot 200x200, все в 128 МГц. > run Dhrystone.bin Reading file.. Loading the Dhrystone.bin 25844 bytes large took 33646 usecs First 8 bytes in EXRAM: 0 DC 0 20 39 6 0 20 Starting the Dhrystone.bin ... Dhrystone Benchmark, Version 2.1 (Language: C) Execution starts, 300000 runs through Dhrystone Execution ends Microseconds for one run through Dhrystone: 9.50 Dhrystones per Second: 105309.90 VAX MIPS rating = 59.94 *** > run Mandelbrot.bin Reading file.. Loading the Mandelbrot.bin 32976 bytes large took 43246 usecs First 8 bytes in EXRAM: 0 DC 0 20 21 22 0 20 Starting the Mandelbrot.bin ... Allocated 120000 bytes for image buffer.. Mandelbrot starts.. Elapsed 104978 msecs Writing the .bmp to SDcard.. Done..

Пито
Пн 16 января 2017 г. 9:49
Вернитесь из приложения, работающего через переход, чтобы сбросить обратно в Xloader Works, как и ожидалось.
В этой сессии :) Dhrystone работает 2x, а затем возвращается к Xloader: ### Hello from xLOADER v1.03 ! ### Usage: help dir run APP.bin > dir Root dir: DATA.BMP STM_Dhrystone128.ino.bin STM_HelloToggle_fromEXRAM.ino.bin STM_SDLOGGER_FreeRtos_FIFO__FIRFILTER.ino.bin STM_Whetstone.ino.bin STM_bench.ino.bin STM_BubbleSort_EXRAM_ALL.ino.bin Dhrystone.bin STM_Mandelbrot_SeaHorseValley.ino.bin Mandelbrot.bin Dhrystone_jmp_rst.bin > run Dhrystone_jmp_rst.bin Reading file.. Loading the Dhrystone_jmp_rst.bin 25932 bytes large took 33657 usecs First 8 bytes in EXRAM: 0 DC 0 20 79 6 0 20 Starting the Dhrystone_jmp_rst.bin ... Dhrystone Benchmark, Version 2.1 (Language: C) Execution starts, 300000 runs through Dhrystone Execution ends Microseconds for one run through Dhrystone: 9.56 Dhrystones per Second: 104601.60 VAX MIPS rating = 59.53 *** Dhrystone Benchmark, Version 2.1 (Language: C) Execution starts, 300000 runs through Dhrystone Execution ends Microseconds for one run through Dhrystone: 9.56 Dhrystones per Second: 104601.56 VAX MIPS rating = 59.53 *** ### Hello from xLOADER v1.03 ! ### Usage: help dir run APP.bin >

Пито
Вторник 17 января 2017 12:32
Exram_variants_classic_v1.jpg
Exram_variants_classic_v1.JPG (65.17 киб) просмотрено 885 раз

Пито
Пт 24 марта 2017 г. 15:50
CP/M на Arduino Nano:

https: // форум.Ардуино.CC/INDEX.PHP?топи ... rdseen#new

Это можно легко запустить с помощью CP/M_RAM, помещенного в кучу 512KB.
На 128 МГц это будет немного быстрее.. :)

Ахулл
Пт 24 марта 2017 г., 11:25
Пито написал:CP/M на Arduino Nano:

https: // форум.Ардуино.CC/INDEX.PHP?топи ... rdseen#new

Это можно легко запустить с помощью CP/M_RAM, помещенного в кучу 512KB.
На 128 МГц это будет немного быстрее.. :)

Ахулл
Пт 24 марта 2017 г. 11:55
Быстрый разговор с дядей Google привел меня к этому... https: // github.com/companje/altair8800

Пито
Сб 25 марта 2017 г. 11:55
Я построил свой первый компьютер 8085 в 82 году. Я хорошо знаю о том, о чем вы мечтаете.. : ugeek:
Я думаю, что плата ZET6 с 512 или 1024 КБ внешней оперативной памяти является идеальной и дешевой платформой для таких ретро-компонентов..

Ахулл
Сб 25 марта 2017 г. 12:49
Пито написал:Я построил свой первый компьютер 8085 в 82 году. Я хорошо знаю о том, о чем вы мечтаете.. : ugeek:
Я думаю, что плата ZET6 с 512 или 1024 КБ внешней оперативной памяти является идеальной и дешевой платформой для таких ретро-компонентов..

Ахулл
Пн 27 марта 2017 г. 12:38
Я просто подумал, что добавлю это в повод по теме, эта тема в настоящее время следует...
https: // chackaday.com/2017/03/25/cpm-8266/

Пито
Чт 30 марта 2017 г. 8:31
Есть код

https: // github.com/dreamy16101976/cpm4nano

Foxylab использует там некоторые настройки регистра AVR, поэтому он не будет компилироваться прямо в STM32Duino. Нужен немного настройки.
Также можно разместить 64 -килограммовую мем..