Аппаратные и программные средства встраиваемых систем



Pdf көрінісі
бет217/268
Дата07.01.2022
өлшемі3,23 Mb.
#18255
1   ...   213   214   215   216   217   218   219   220   ...   268
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 
привело бы к непредсказуемым последствиям. 


Достарыңызбен бөлісу:
1   ...   213   214   215   216   217   218   219   220   ...   268




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет