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
привело бы к непредсказуемым последствиям.
Достарыңызбен бөлісу: