|
startup для lpc1788 |
|
|
|
Dec 10 2013, 09:02
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 11-10-13
Пользователь №: 78 698

|
Здравствуйте! Подскажите, пожалуйста, где можно взять startup.s для LPC1788. Я думал он должен быть в комплекте с LPC177x_8x CMSIS, но там его не оказалось. На сайте ARM со спецификацией CMSIS-SP-00300-r3p1-00rel0 идет startup_ARMCM3.s, но как я понимаю не для конкретной реализации. Если я правильно понял, то код запуска надо писать самому?
Сообщение отредактировал kentarchos - Dec 10 2013, 09:06
|
|
|
|
|
Dec 10 2013, 15:55
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 11-10-13
Пользователь №: 78 698

|
Цитата(megajohn @ Dec 10 2013, 14:33)  вот
startup_LPC177x_8x.txt ( 12.3 килобайт )
Кол-во скачиваний: 356и переименовать в startup_LPC177x_8x.s Большое спасибо! Только меня больше интересует вопрос, распространяется ли этот файл где-то официально или его надо писать, либо выдергивать откуда-то (из Keil напирмер)?
|
|
|
|
|
Dec 24 2013, 17:21
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 11-10-13
Пользователь №: 78 698

|
toweroffСпасибо! У меня небольшой вопрос не совсем по этой теме. Я нигде не могу прочесть зачем необходимо область STACK и HEAP выравнивать на границу 8-ми байтов: Код Stack_Size EQU 0x00000200
AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp
; <h> Heap Configuration ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h>
Heap_Size EQU 0x00000400
AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit Подскажите пожалуйста, зачем это делается?
Сообщение отредактировал kentarchos - Dec 24 2013, 17:22
|
|
|
|
|
Dec 24 2013, 18:04
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 11-10-13
Пользователь №: 78 698

|
Цитата(megajohn @ Dec 24 2013, 21:47)  вроде, нужно для плавучки понять бы еще что такое плавучка)
|
|
|
|
|
Dec 24 2013, 18:36
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Цитата(kentarchos @ Dec 24 2013, 21:21)  Я нигде не могу прочесть зачем необходимо область STACK и HEAP выравнивать на границу 8-ми байтов Некоторые команды в некоторых режимах требуют выравнивания их данных, располагающихся в памяти, на границу 8 байтов. Подробностей я не помню (тем более, они отличаются в разных версиях архитектуры ARM -- а листать мануалы, понятное дело, лениво) и на практике на такую необходимость не натыкался, но на всякий случай лучше выравнивание соблюдать. P.S. А плавучка -- это арифметика с плавающей запятой. Вычисления с двойной точностью оперируют 64-разрядными числами, которые естественно выравнивать на границу 8 байтов -- правда, таковые вычисления на микроконтроллерах реализуются лишь чисто программно, когда вполне достаточно 4-байтового выравнивания. Вот на микропроцессорах, где имеется FPU, нужда в 8-байтовом выравнивании может быть реальной -- но я с таковыми пока не сталкивался, поэтому утверждать не буду.
Сообщение отредактировал SII - Dec 24 2013, 18:38
|
|
|
|
|
Dec 24 2013, 19:57
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 14-01-10
Пользователь №: 54 821

|
Цитата(kentarchos @ Dec 24 2013, 21:04)  понять бы еще что такое плавучка) это как бы точка,- то плавает то фиксируется - ну вы поняли  а по иноземному - float point По сути у - блок обработки чисел с такой арифметикой (а в особенности если мы используем double) сделан так что быстрее он выбирает из памяти те числа, что расположены в памяти с нужным выравниванием. Предполагается что никто не хочет терять лишний такт на обработке каждого значения. Это теория и практика еще со времен первых сопроцессоров для вычислений с плавающей точкой. Для микропроцессоров то же самое, и в особенности такое выравнивание рекомендуется (а иногда императивно требуется) для операций с SIMD командами. Можно конечно использовать команды и без выравнивания, но они и выполняются медленнее. Вот где-то так.
Сообщение отредактировал b32b - Dec 24 2013, 20:05
|
|
|
|
|
Dec 25 2013, 11:34
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 11-10-13
Пользователь №: 78 698

|
Спасибо всем! Впервые слышу такое название для чисел формата/стандарта 754. Но у меня возникает тогда вопрос: зачем выравнивать стек, если в стеке хранятся 32-битные регистры, а в куче могут храниться данные разных типов? И потом этоже выравнивание всего сегмента целиком. Или я все неправильно понимаю?
|
|
|
|
|
Dec 25 2013, 12:54
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Цитата(kentarchos @ Dec 25 2013, 15:34)  Спасибо всем! Впервые слышу такое название для чисел формата/стандарта 754. Но у меня возникает тогда вопрос: зачем выравнивать стек, если в стеке хранятся 32-битные регистры, а в куче могут храниться данные разных типов? И потом этоже выравнивание всего сегмента целиком. Или я все неправильно понимаю? Если посмотрите описание языка ассемблера KEIL, то обнаружите там две директивы -- кажется, PRESERVE8 и REQUIRE8, точно не помню. Они соответственно указывают, что данный модуль на языке ассемблера гарантирует сохранность 8-байтового выравнивания стека или требует, чтобы стек был выровнен на 8-байтовую границу (без них считается, что стек выровнен только на 4-байтовую границу). Компиляторы языков высокого уровня вроде бы порождают код, гарантирующий такое выравнивание (специально я этим вопросом не интересовался; при желании можно порыться в документации). Компоновщик же, собирая программу из объектных файлов, проверяет атрибуты выравнивания для каждого файла. Если окажется, что некий файл требует 8-байтового выравнивания стека, а входящие в его состав подпрограммы вызываются из файла, не гарантирующего такое выравнивание, он выдаст ошибку и откажется собирать программу. Таким путём обеспечивается контроль правильности выравнивания стека -- ну а нужно ли оно реально, решать программисту и компилятору (например, если при трансляции программы последний не использует команды, требующие 8-байтового выравнивания, то протранслированному модулю таковое и не требуется). Каждый выделяемый элемент кучи также должен быть выровнен на границу 8 байтов, поскольку заранее нельзя сказать, как он будет использоваться: а вдруг к нему будут обращаться команды, требующие такого выравнивания? Кроме того, возможна (и нередко вполне целесообразна) такая схема хранения списка свободных участков кучи, когда этот список хранится в самих свободных участках: есть некая переменная, в которой лежит адрес первого свободного участка; в начале каждого участка располагается заголовок из двух полей, содержащий адрес следующего свободного участка и длину текущего свободного участка. На 32-разрядной машине каждая из этих величин имеет размер 32 бита, что в сумме даёт длину заголовка 8 байт -- а это ограничивает минимальный размер каждого свободного участка кучи 8 байтами, а заодно намекает на естественность их выравнивания на границу 8 байтов и выделения кусками, кратными по длине 8 байтам независимо от того, какая длина реально запрошена. По этой причине, если выделять, скажем, память из кучи кусочками по 3 байта, реально будет каждый раз выделяться 8 байт -- и куча будет израсходована намного быстрей, чем можно ожидать лишь на основе её объёма и длины выделяемых блоков. Что же до разрядности, то 32-разрядные регистры общего назначения никак не отменяют возможности доступа к 64-разрядным данным. Во-первых, есть команды загрузки/сохранения пары регистров общего назначения (LDRD/STRD), которые могут требовать 8-байтового выравнивания (а могут и не требовать -- зависит от состояния какого-там бита в каком-то из управляющих регистров, насколько помню). Во-вторых, у сопроцессора с плавающей запятой (FPU) регистры в общем случае 64-разрядные, поскольку он должен уметь работать не только с 32-разрядными, но и с 64-разрядными числами с плавающей запятой (правда, такой сопроцессор мало где имеется: с ядрами Cortex-M4 интегрирован сопроцессор, поддерживающий лишь 32-разрядную вещественную арифметику, другие ядра серии Cortex-M, как и очень многие процессоры и микроконтроллеры предыдущих версий архитектуры, FPU часто вообще не имеют, и лишь у Cortex-A вроде бы у всех есть FPU с арифметикой двойной точности). Наконец, даже при принципиальной работоспособности без выравнивания на 8-байтовую границу (и вообще без выравнивания) правильное выравнивание обычно способствует повышению производительности. Например, та же команда LDRD, загружающая из памяти пару регистров общего назначения, т.е. два 32-разрядных слова, может выполняться заметно медленнее, если эта пара слов не выровнена на 8-байтовую границу: в такой ситуации одно слово может оказаться в одной строке кэша, а второе -- в другой строке или же вообще в кэше отсутствовать, что потребует считывания его из ОЗУ, и всё это время процессор будет стоять. Понятно, что подобные тормоза из-за нарушения выравнивания характерны в первую очередь для высокопроизводительных процессоров (ядра Cortex-A, а не сравнительно медленные Cortex-M, не имеющие широких внутренних шин, многоуровневой кэш-памяти и т.д. и т.п.), но требования-то пишутся для общего случая, а не для частного.
|
|
|
|
|
Dec 25 2013, 13:37
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 11-10-13
Пользователь №: 78 698

|
SII большое спасибо за подробнейший ответ! Теперь все понятно. Просто я разбираюсь в startup коде для LPC1788, который Cortex-M3 и поэтому сложно было понять зачем нужно такое выравнивание для такого ядра. Наверное я забежал слишком вперед, ведь я начинаю изучать с нуля. Еще раз большое спасибо! Ваш пост очень интересный!
|
|
|
|
|
Dec 26 2013, 04:07
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 11-10-13
Пользователь №: 78 698

|
SII Спасибо большое! Я тоже хочу в будущем освоить asm, но решил начать с Си, так как нет даже базовых знаний о МК.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|