Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Пользователю -> Евстифеев А.В. -> "Микроконтроллеры семейства" -> 99

Микроконтроллеры семейства - Евстифеев А.В.

Евстифеев А.В. Микроконтроллеры семейства — Infineon, 2007. — 318 c.
Скачать (прямая ссылка): microkontrolleri2007.pdf
Предыдущая << 1 .. 93 94 95 96 97 98 < 99 > 100 >> Следующая


Рисунок 19-1

Создание физического адреса стека

В следующем примере показывается работа механизма циркулирующего стека, оказывающего эффект на размещение виртуального стека. Сначала регистр Rl сохраняется в наименьшем физическом адресе

14-5 МЭИ, Центр Промышленной Электроники Фирмы Infineon

Системное программирование/С167

стека, согласно выбранному размеру стека. По следующей команде регистр R2 будет сохранен по наибольшему адресу стека, при этом значение SP будет уменьшено на 2.

MOV SP, #OF8O2H ;Установка значения SP после ввода в

; физический стек 256 слов ;(SP) = F8O2H: Физический адрес = FAO2H PUSH R1 ;(sp) = F8OOH: Физический адрес = FAOOH

PUSH R2 ;(sp) = F7FEH: Физический адрес = FBFEH

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

Примечание: Режим циркулярного стека применим для стека размером 32 или 512 слов (STKSZ = OOO или 1OO). Этот режим не применим для STKSZ = 111, так как при этом под внутренний стек используется вся область внутреннего RAM.

При достижении одной из границ внутреннего стека, вызывается ловушка по переполнению или опустошению стека. В подпрограмме обслуживания ловушки осуществляется перемещение заранее установленной части внутреннего стека из внешнего стека или во внешний стек. Общее количество переданных данных определяется средним необходимым значением стека, а также зависит от частоты совершения входов в подпрограммы, от частоты обслуживания ловушек и прерываний. В большинстве случаев эта величина составляет от % до 1/1O от размера внутреннего стека. После завершения передачи, значение указателей границ стека изменяется и отражает заново определенную область внутреннего стека. Таким образом можно писать программы не обращая внимание на ограничения размера стека. При использовании этого механизма увеличивается время выполнения программы, за счет выполнения подпрограмм обслуживания ловушек.

Для инициализации микроконтроллера в режим циркулярного стека необходимо произвести следующие операции:

• Определить размер области физического системного стека во внутренней RAM (битовое поле STKSZ регистра SYSCON)

• Определить два регистра границ внешнего стека. Эти значения будут позже проверяться при передачи данных во внешний стек во время выполнения подпрограмм обслуживания ловушек

15-6 МЭИ, Центр Промышленной Электроники Фирмы Infineon

Системное программирование /С167

• Установить указатель переполнения стека (STKOV) на предел области внутреннего стека, причем к величине предела необходимо добавить 6 слов (необходимо зарезервировать пространство для сохранения двух входов в прерывание).

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

При достижении опустошения стека, дно стека перезагружается из области внешней памяти и после этого изменяются значения внутренних указателей.

Линейный стек

Архитектура С167 позволяет использовать режим линейного стека (STKSZ = 111). В этом режиме системный стек занимает всю область внутренней RAM. При этом создается большой объем стека, и отпадает необходимость в подпрограммах для передачи данных в режиме циркулирующего стека. Однако в режиме линейного стека не остается места в RAM для переменных или программного кода. В этом режиме обнаружение переполнения или опустошения стека обслуживается как фатальная ошибка.

Несмотря та то, что указатель стека может покрывать область адресов от OOCFOOOh до OOFFFE+, физически системный стек должен располагаться во внутренней RAM. Таким образом использоваться может только область OOCF6OO+-OOCFDFEh.

Примечание: Следует избегать осуществления доступа к адресам OOCFOOOh - OOCF5FE+, поскольку в них содержатся ESFR-регистры, а также зарезервированная область.

Пользовательский стек

Пользовательский стек предназначен для разгрузки системного стека путем создания стеков данных отдельного для каждой задачи. При использовании пользовательского стека отсутствует аппаратное определение переполнения и опустошения стека. Для осуществления пользовательского стека подходят следующие режимы адресации:
Предыдущая << 1 .. 93 94 95 96 97 98 < 99 > 100 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100