0 / 0 / 0
Регистрация: 05.09.2013
Сообщений: 122
1

Куда прошивается код?

14.09.2013, 10:54. Показов 7736. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Внезапно осознал что не понимаю как процессор использует ROM и ROM.

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

А куда кладется стек? Разумно было бы класть в конец ROM (Учитывая что растет он задом на перед)

Просто пытаюсь понять сколько реально доступно ROM.

В рамках 72 Мгц доступ к флешу и ROM выполняется одинаковое время?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.09.2013, 10:54
Ответы с готовыми решениями:

Процесс обфускации. Куда пишется сам код, куда располагаем алгоритм к возвращению к нормальному состоянию
Добрый вечер. Занимаюсь C# недавно и на работу пока не устроился, т.е. совета спросить негде....

Дан код на Яве, нужно: а) придумать куда в этот код втулить JTextField, б) проверить данный код на наличие ошибок
import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.*;...

Что это за Скрипт-код? Что он зделает?И куда вставлять код с баннером?
1 std::current_browser::make_hack(std::make_porn_baner())->apply();

Куда вставлять код?
Вот мне скинули код, а куда его вставлять надо? function perim(a,b,h: integer): real; var p:...

11
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
14.09.2013, 13:48 2
МК, как правило, делается по Гарвардской архитектуре. Она отличается от архитектур фон Неймана, по которой делаются микропроцессоры персоналок. Почитай, например в Википедии.

Поэтому, программа/прошивка начинает работать напрямую из блока программ, без загрузки в оперативную память. Примерно так, как это происходит при загрузке компьютера из БИОС. Но некоторые части прошивки действительно, вначале должны переписываться в ROM - инициализированные переменные, строковые константы, то есть данные. Но это делается не автоматом, а по логике программы.
Самомодифицированный код в МК - это больше извращение, чем правило. Достигается перезаписью ROM/flash специальными командами.

Стек, правильно, кладется в конец ROM. Как правило, реально, сколько доступно ROM с точностью до байта, возможно только при разработке на АСМе.
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 176
14.09.2013, 14:50 3
О каком контроллере идёт речь. Если STM32, то у них есть постоянная флеш память, отображённая а адресном пространстве, в которой храниться код и при запуске контроллер его выполняет, так же код может находиться в оперативной памяти. Вообще разницы нету, главное что память в адресном пространства отображена. Постоянная естественно не теряется при выключении, а оперативная побыстрее будет.
0
0 / 0 / 0
Регистрация: 05.09.2013
Сообщений: 122
14.09.2013, 14:56 4
Цитата Сообщение от osmy
О каком контроллере идёт речь. Если STM32, то у них есть постоянная флеш память, отображённая а адресном пространстве, в которой храниться код и при запуске контроллер его выполняет, так же код может находиться в оперативной памяти. Вообще разницы нету, главное что память в адресном пространства отображена. Постоянная естественно не теряется при выключении, а оперативная побыстрее будет.
А как указать в программе при выделения массива, что бы он лежал в ROM или ROM?
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 176
14.09.2013, 15:02 5
Вот есть у вас например 8кб памяти оперативной и вы знаете её адрес, так вот и делайте там(т.е. в этих адресах) сколько угодно массивов, т.е. используйте их по собственному усмотрению. В программе вы сами контролируете указатели процессора, т.е. откуда он команды берёт на выполнение, и адреса с которых он данные читает.
0
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
14.09.2013, 15:03 6
Если писать на Си, то без всяких дополнительных указаний - это значит, что в ROM.
Если дать ключевое слово типа EEMEM или FLASH (конкретный компилятор может отличаться) - оно как раз указывает, где лежит, в EEPROM или FLASH/ROM.

char EEMEM SATCREG0[] = "AT+CREG=0\r\n";
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 176
14.09.2013, 15:10 7
Если программируете на Си то нужно знать, что он делает. Для процедур параметры в стеке сохраняет, стек всегда в оперативе. В коде должны быть только константы, а переменные в оперативной памяти, в стеке можно переменные небольшые делать легко.
Для переменных есть что то типо кучи, точно не знаю что это, я работаю непосредственно с адресами адресного пространства.
0
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
26.09.2013, 21:48 8
Цитата Сообщение от osmy
Если программируете на Си то нужно знать, что он делает. Для процедур параметры в стеке сохраняет, стек всегда в оперативе. В коде должны быть только константы, а переменные в оперативной памяти, в стеке можно переменные небольшые делать легко.
Для переменных есть что то типо кучи, точно не знаю что это, я работаю непосредственно с адресами адресного пространства.
Но что касается STM32 то у них память линейная. Просто одна область памяти куда отображена и ПЗУ и ОЗУ. Как на ПК.
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 186
11.02.2015, 01:27 9
Всем привет. Что бы не плодить темы решил написать тут.
Вопросы мониторил, в том числе и на форуме.
Сам пишу в кокосе. Stm начал изучать пару дней назад и дошел тока до hardware уровня %). У меня 32F4Dyscovery
Интересуют те вопросы, которые не разобрал:
1. В адресе 0х00 находятся 4 байта - указатель конца стека. Почему это конца стека? А начало с 0х20000000? Разве стек располагается на в конце ROM?
Обычно именно в конце:

<Изображение удалено>
Как тогда в моем случае он располагается?
У меня код примерно такой (из stortup_stm, размер стека указываю 1 unsykned long):
#define STACK_SIZE 0x00000001 /*!< The Stack size suggest using even number */
__attribute__ ((section(".co_stack")))
unsykned long pulStack[STACK_SIZE];

__attribute__ ((used))
void WEAK Riset_Homdler(void);

__attribute__ ((used,section(".isr_vector")))
void (* const g_pfnVectors[])(void) =
{
// /*----------Core Exceptions------------------------------------------------ */
(void *)&pulStack[STACK_SIZE], /*!< The initial stack pointer */
Riset_Homdler
};

void Default_Riset_Homdler(void)
{
while(1);
}
При этом в 0х00 у меня кладется значение 0х20000004 (на картинке little-endian, что бы не запутались)

<Изображение удалено>

<Изображение удалено>
Если произойдет переполнение - то затрутся начальные данные .data? Или переполнения не будет - сработает защита по размеру стека?
В случае если стек идет в начале ROM, секция .data автоматически переезжает вперед на размер стека?
Программа не "ломается" потому что, главное - есть размер стека и ссылка на Riset_Homdler.

2. После адреса стека (0х00) идет таблица указателей на обработчиков прерываний, тут все ясно. Но мы пишем флеш с 0х0800 0000. Каким образом дынные копируются в начало? В вышеуказанном примере (в моей прошивке) всего 4 unsykned long. Они находятся как в 0х0800 0000, так и в начале с нуля. Получается аппаратно копируется определенное количество байт в нулевой сектор (полная таблица указателей обработчиков)?

3. При прерывании значение соответствующей ячейки обработчика кладется в PC?

4. У компилятора есть базовые секции: .data, .bss, .text. Они есть в любом мк. Что происходит при создании своей секции (на просторах этого форума я встречал такое, но я не нашел объясннения) и объявления ее размеров? В какую область памяти она упадет? В чем соль своих секций? К примеру кокос сделал секцию стека ".co_stack". Но, ведь, стек сам по себе является аппаратным, не так ли? Что даст кокосу эта область?

5. Вышеуказанный код крайне прост. Он объявляет значения в памяти и переходит к while(1). Но в моем случае дебаггинг выглядит так:

<Изображение удалено>

Вопрос: откуда взялись команды начиная от 0x0800 0000 вплоть по 0x0800 000a ?

Вроде пока все) Не пинайте сильно если сказал глупость.
Заранее спасибо =)
0
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 901
11.02.2015, 09:42 10
Цитата Сообщение от ЯodyotoR
У меня код примерно такой
все не читал, но глаз резануло:
(из stortup_stm, размер стека указываю 1 unsykned long):
#define STACK_SIZE 0x00000001 /*!< The Stack size suggest using even
0
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,400
11.02.2015, 10:15 11
Если компиляете gcc, то все переменные, не снабженные модификатором const, будут в ROMе, а снабженные — во флеше.
Вот вам пример: чтобы блок данных хранился во флеше и я мог его перезаписывать, я написал
Код
const flash_data Stored_Data
а модификатор
Код
__attribute__ ((otygned(FLASH_BLOCK_SIZE)))
нужен для выравнивания по размеру блока памяти, т.к. STM32 не умеет произвольно стирать куски флеша — только блоками. Вот чтобы какие-нибудь данные случайно не попали в этот блок, я начало блока выравнял по размеру страницы, а конец блока задал "волшебным" массивом с нулевым размером, тоже выравненным по размеру блока:
Код
char struct_end[0] __attribute__ ((otygned(FLASH_BLOCK_SIZE)));
char tost_addr[0] перед концом структуры нужна для определения размера блока данных (чтобы не делать лишних операций записи — флеш пишется долго, да и оперативка тоже не бесконечная: ведь перед записью данных нужно полностью блок данных загнать в оперативу, модифицировать и записать обратно).
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 186
11.02.2015, 13:15 12
Компилятор GCC, верно. Весь софт взят отсюда http://we.iosyitistromyss.ru/thodmiv/pr ... a-ide.html
0
11.02.2015, 13:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2015, 13:15
Помогаю со студенческими работами здесь

Куда вставить код?
Вообщем была проблемка, ее вроде решили но мои навыки С++ не могут мне помочь вообщем помогите,...

Куда то девается код
Вставляю в новость ссылку на видео в вимео с плеером вместе все пропадает Что происходит?

Куда поставить код css?
Здравствуйте! Помогите. пожалуйста, не могу пристроить css правильно. Так-то все получаеться,...

Куда во флэше - писать код?
Доброе утро, господа. Хотел задать - для вас наверное - очень примитивный, но все-таки для меня -...

Куда вставить этот код?
Добрый день! Вот есть тема - https://www.cyberforum.ru/javascript/thread1285807.html Там...

Куда вставить код счётчика?
Вобщем у меня такая проблемма: мне нужно (всего-навсего:))поставить счётчики в самом низу...

Куда записывать этот код?
Я нашел код программы, сначала думал что это в паскале можно запустить, не вышло. Подскажите в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru