Альтернативой расширению памяти является использование варианта HCS12 с большей дополнительной областью RAM. Обратитесь к различным доступным вариантам, описанным в разделах 1.3, 1.4 и 4.8. Эти варианты включают в себя RAM объемом от 4 до 12 Кб.
Перед продолжением нашего обсуждения, относящегося к динамическому распределению памяти, рассмотрим еще несколько проблем, воспользовавшись рис. 8.2.
Вопросы для самопроверки
Вопрос:Какова цель применения схемы И-НЕ?
Ответ: Логический элемент И-НЕ переходит на низкий уровень и генерирует сигнал разрешения (CE) для SRAM памяти, когда A15 находится на низком , а A14 — на высоком уровне.
Вопрос: Какова цель применения микросхемы 74HC573?
Ответ: Эта микросхема действует как защелка при демультиплексировании линий адреса/данных от порта РA.
Вопрос:Каков промежуток адресов памяти RAM?
Ответ:От $4000 до $7FFF или 16 Кб RAM.
Вопрос:Каков размер SRAM памяти?
Ответ:Этот размер составляет 215 или 32К адресов с размещением одного байта в каждом адресе. Нам удается использовать только нижние 16 Кб памяти.
Вопрос: Какой вид будет иметь карта памяти после введения этих новых компонентов памяти.
Ответ: Карта памяти приведена на рис. 8.3.
$0000 $01FF |
Регистры ЦП |
$0800 $0BFF |
1 Кб RAM «на чипе»; • Код/данные пользователя ($0800-$09FF); • Резервирована для D-Bug12 ($0A00-$0BFF) |
|
|
$0D00 $0FFF |
768 байт EEPROM «на чипе»; • Код/данные пользователя |
|
|
$8000 $FFFF |
FLASH EEPROM 32 Кб «на чипе»; • код D-Bug12 ($8000–$F67F); • Область, доступная пользователю ($F6C0–$F6FF); • Настройка функций D–Bug12 ($F680-$F6BF); • Код запуска D-Bug12 ($F700–$F77F); • Таблица вектора прерывания ($F780–$F7FF); • Расширение загрузчика ($F800–$FBFF); • EEPROM загрузчика ($FC00–$FFBF); • Векторы сброса и прерывания ($FFC0–$FFFF) |
Рис. 8.3.Карта памяти B32, расширенная внешней флеш-памятью и RAM
8.3.2. Динамическое распределение памяти
В компиляторе С для эффективного управления динамической памятью используются указатели. Они позволяют объявить большое число переменных различных типов и размеров. Когда память динамически распределена для переменных в RAM, указатель может привести вас к ресурсам памяти для переменной.
Динамическое распределение памяти осуществляется с помощью команды распределения памяти malloc()
. Эта команда содержится в файле заголовка stdlib.h, который является частью любого С компилятора. Команда malloc()
обычно используется вместе с функцией sizeof()
. Эта комбинация функций чрезвычайно полезна при динамическом распределении памяти. Общая форма этой комбинации функций:
Ptr = (variable_type)*malloc(sizeof(variable_type));
Большинство структур данных объявляется и распределяется с помощью этой методики. Когда переменная больше не нужна, пространство памяти используемое для нее, возвращается системе с помощью функции free()
. Это наилучший способ динамического распределения памяти. Мы создаем переменные на ходу (в процессе выполнения программы), когда мы нуждаемся в них, и избавляемся от переменных, когда они больше не нужны.
При таком распределении и освобождении памяти, происходящем в процессе выполнения программы, необходима эффективная система управления памятью. Динамическая память — это часть памяти RAM, используемая для динамического распределения памяти. Как мы упомянули прежде, важно сохранять стек и динамическую память, отделенными от друг друга.
Теперь, когда мы имеем два отдельных пространства RAM в нашей карте памяти, мы можем легко выделить одну из них для стека, а другую — для динамической памяти. Мы рекомендуем использование меньшего пространства для стека и большего для динамической памяти. В данном компиляторе имеются параметры настройки, конфигурируемые пользователем и позволяющие установить адрес начала для стека и области динамической памяти.
Получив способ динамического распределения памяти, мы можем теперь создавать структуры данных для использования в наших ОСРВ. В следующем разделе мы проведем общий обзор структур данных, используемых в ОСРВ: структур (или записей), списков с указателями, очередей, и круговых очередей. Как только мы познакомимся с каждым из этих основных типов, мы сможем объединять их в более сложные структуры данных, используемые для работы ОСРВ.
В этом разделе мы проведем общий обзор структур данных, используемых в операционных системах, работающих в режиме реального времени. Мы выполним обзор каждой структуры данных отдельно и затем объединим их, чтобы выполнять различные операции внутри ОСРВ.
Читать дальше