реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Как скомпилировать сишный код в RAM?
Сергей Борщ
сообщение Nov 26 2012, 21:56
Сообщение #16


Гуру
******

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



QUOTE (AndyDev @ Nov 26 2012, 15:55) *
А сами критичные функции, как-то ДПФ и т.д. - ускорились почти в два раза.
Спасибо, полезная информация.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 26 2012, 22:50
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(AndyDev @ Nov 26 2012, 15:55) *
Перенес несколько критичных к скорости функций в ОЗУ, и вся программа стала работать примерно на 50-60% быстрее.

Интересно, спасибо.

Цитата(AndyDev @ Nov 26 2012, 15:55) *
А сами критичные функции, как-то ДПФ и т.д. - ускорились почти в два раза.

Попробовал потестить тем что под руку попалось: 50 не 50 - видимо зависит от функций.
Получилось - 20770 циклов из flash и 16600 циклов из ОЗУ - быстрей на 25 %,
CM0 приблизился к CM3 из flash на той же функции. sm.gif
Если конечно чего не попутал, что тоже возможно на ночь глядя.
Тактовая на тестовом проекте была вроде 48, но это наверное не важно, если wait-стайтов 3?.

PS. На каких бы функциях потестить и чтобы со сборкой функций не париться - что есть такое неэкзотическое.

Цитата(AndyDev @ Nov 26 2012, 15:55) *
Делитель тактовой частоты FlashClock = 3 .

Про FlashClock DS ничего не знает. FLASHTIM=2?
Могут быть ещё настройки влияющие на скорость выполнения из флеш у lpc11xx?
Go to the top of the page
 
+Quote Post
AndyDev
сообщение Nov 27 2012, 22:40
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406



Цитата(_Артём_ @ Nov 27 2012, 02:50) *
Про FlashClock DS ничего не знает. FLASHTIM=2?
Могут быть ещё настройки влияющие на скорость выполнения из флеш у lpc11xx?


Не знаю, что такое DS )
Думаю, что больше настроек нет.

Устанавливаю так:

Код
      LPC_FLASH->FLASHCFG = (LPC_FLASH->FLASHCFG & 0xFFFFFFFC) | 0x2;    // FlashClock = 3 (установить делитель
                                                        // тактовой частоты для FlashMemory равным 3,
                                                        // для частот тактирования 40..50МГц
                                                        // (по умолчанию при сбросе так же)

Go to the top of the page
 
+Quote Post
Вячик13
сообщение Nov 29 2012, 06:16
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604



Как поместить при компилировании, допустим, подпрограмму в ОЗУ мне понятно. Но разъясните, пожалуйста, поподробнее, как при старте приложения туда записать тело подпрограммы, если у меня нет загрузки извне, а приложение уже находится в FLASH?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 29 2012, 07:03
Сообщение #20


Гуру
******

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



QUOTE (Вячик13 @ Nov 29 2012, 08:16) *
как при старте приложения туда записать тело подпрограммы, если у меня нет загрузки извне, а приложение уже находится в FLASH?
Точно также, как в ОЗУ попадают начальные значения инициализированных переменных - образ этой области ОЗУ хранится во флеше и перед запуском main() копируется в ОЗУ стартап-кодом. Если ваши функции поместить в этот же сегмент, то они могут быть скопированы в этом же цикле. А может быть в вашей среде разработки это делается отдельным циклом, значит размещать надо в другой сегмент. Или вообще для этого есть ключевое слово и компилятор по нему все разместит куда надо сам. Не ленитесь, изучите документацию на ваш компилятор/линкер - там наверняка этот вопрос расписан и пример есть.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
редактор
сообщение Nov 29 2012, 07:05
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



За это отвечает стартап файл. Изначально тело подпрограммы зашито в код где то в области констант наверно.
При загрузке МК стартап проводит инициализацию памяти, копирует константы, в том числе и код RAM-функций.
Как-то так.


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
Вячик13
сообщение Nov 29 2012, 07:26
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604



Спасибо, понял.
Go to the top of the page
 
+Quote Post
AndyDev
сообщение Feb 12 2013, 18:10
Сообщение #23


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406



Не совсем по теме, но в том же проекте.

Использую функцию memset() для очистки памяти.
Все работает, но при компиляции всегда выдает предупреждение:

TestMain.c(1295): warning: #223-D: function "memset" declared implicitly

Оно и понятно, т.к. в инклудах не указан файл с этой функцией.
Но какой файл надо указать - я не знаю. В стандартных типа stdio и stdlib ее нету.
Go to the top of the page
 
+Quote Post
-JonnS-
сообщение Feb 12 2013, 18:51
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-05-07
Из: Болгария
Пользователь №: 27 577



Цитата
В стандартных типа stdio и stdlib ее нету.

string.h
Go to the top of the page
 
+Quote Post
AndyDev
сообщение Feb 13 2013, 09:18
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406



Цитата(-JonnS- @ Feb 12 2013, 22:51) *

Большое спасибо, помогло.

И еще, можно ли в сишном исходнике принудительно указать, чтобы какие-то данные тоже выравнивались на границу, скажем 4 байта (границу слова). Допустим, у меня есть массив из short (16 бит), который при компиляции будет размещен выровненным на границу 2-х байт. Но работая с ним из ассемблера, мне бы было удобно считывать сразу по несколько 16-битных переменных таким образом LDM R0!,{R1,R2}. Но для этого массив обязательно должен быть выровнен на границу слова (4 байта).

Сообщение отредактировал AndyDev - Feb 13 2013, 09:28
Go to the top of the page
 
+Quote Post
Lotor
сообщение Feb 13 2013, 09:42
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(AndyDev @ Feb 13 2013, 13:18) *
Большое спасибо, помогло.

И еще, можно ли в сишном исходнике принудительно указать, чтобы какие-то данные тоже выравнивались на границу, скажем 4 байта (границу слова).

Можно. С помощью директив Вашего компилятора.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
AndyDev
сообщение Feb 13 2013, 09:46
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406



Цитата(Lotor @ Feb 13 2013, 13:42) *
Можно. С помощью директив Вашего компилятора.

У меня Keil. Какие у него директивы для этого?
Go to the top of the page
 
+Quote Post
Lotor
сообщение Feb 13 2013, 09:52
Сообщение #28


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(AndyDev @ Feb 13 2013, 13:46) *
У меня Keil. Какие у него директивы для этого?

Как-то так:
Код
__align(8) char buffer[64];


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
AndyDev
сообщение Feb 13 2013, 12:03
Сообщение #29


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406



Цитата(Lotor @ Feb 13 2013, 13:52) *
Как-то так:
Код
__align(8) char buffer[64];

Большое спасибо, очень помогло!
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 05:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016