Аппаратные и программные



Download 3,23 Mb.
Pdf ko'rish
bet144/179
Sana24.02.2022
Hajmi3,23 Mb.
#234030
TuriУчебное пособие
1   ...   140   141   142   143   144   145   146   147   ...   179
5.2.4 Реентерабельность 
В зависимости от модели памяти и количества свободного места
автоматические переменные и параметры функции могут быть помещены в 
стек или в пространство внешней или внутренней памяти. Последний вариант 
делает функцию нереентерабельной. Для того, чтобы разместить 
автоматические переменные в стеке можно воспользоваться опцией 
компилятора --stack-auto (или в тексте программы #pragma stack-auto) или 
ключевым словом reentrant при определении функции. 


226 
unsigned char foo(char i) __reentrant 

... 

Необходимо помнить, что в архитектуре MCS51 стек имеет очень 
небольшой объем. Поэтому опцией --stack-auto необходимо пользоваться 
экономно и с осторожностью. Для решения проблемы с размером стека, можно 
явно указывать тип памяти для автоматической переменной и её абсолютный 
адрес. 
unsigned char foo() 

__xdata unsigned char i; 
__bit bvar; 
__data __at (0x31) unsigned char j
... 

5.2.5 Оверлеи 
В нереентерабельных функциях одна и та же область памяти может быть 
использована повторно. SDCC использует оверлеи по умолчанию. Для 
отключения режима работы с оверлеями необходимо использовать #pragma 
nooverlay. 
#pragma save 
#pragma nooverlay 
void set_error(unsigned char errcd) 

P3 = errcd; 

#pragma restore 
void some_isr () __interrupt (2) 

... 
set_error(10); 
... 

В приведенном примере использование errcd без #pragma nooverlay 
привело бы к непредсказуемым последствиям. 
5.2.6 Обработчики прерываний 
Обработчик прерывания в SDCC имеет следующий вид: 
void timer_isr (void) __interrupt (1) __using (1) 

... 

Ключевое слово __interrupt определяет номер вектора прерываний, а слово 
__using - номер используемого регистрового банка. Явное указание номера 
регистрового банка позволяет уменьшить объем данных, сохраняемых в стеке 


227 
при вызове обработчика. Предполагается естественно, что этот регистровый 
банк кроме обработчика никто не будет использовать. 
Если обработчик прерывания изменяет какие-либо глобальные 
переменные, они должны быть определены с использованием ключевого слова 
volatile. 
/* Номера обработчиков прерываний для ЬК ADuC812 в стенде SDK-1.1: 
адрес = (номер * 8) + 3 */ 
#define IE0_VECTOR 0 /* 0x03 external interrupt 0 */ 
#define TF0_VECTOR 1 /* 0x0b timer 0 */ 
#define IE1_VECTOR 2 /* 0x13 external interrupt 1 */ 
#define TF1_VECTOR 3 /* 0x1b timer 1 */ 
#define SI0_VECTOR 4 /* 0x23 serial port 0 */ 

Download 3,23 Mb.

Do'stlaringiz bilan baham:
1   ...   140   141   142   143   144   145   146   147   ...   179




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish