http://electronix.ru/forum/index.php?showtopic=79333
(Думаю если тему поменять может что то изменится...)
С ИАРом знаком давно, но глубоко не разбирался.
В ИАР АРМ версия 4.42 (в которой работаю) проблем особых не возникало. В частности когда ставишь галочку Defined by application в настройках линкера свои модули типа __low_level_init или __low_level_call_init компилятор не вставляет. В дисассемблере только код моего стартапа и скомпилированный код сишных файлов.
Создал пример в компиляторе IAR MCS-51 7.51A (в IAR MCS-51 7.60.1 в принципе таже лажа).
Хотелось бы чтобы он не вставлял свои "__low_level_init" и прочее (в симуляторе в код модулей компилятор не переходит...)... В настройках линкера поставил глалочку Defined by application.
Написал свой стартап сделал простенькую функцию в main.
настройки general
Device nRF24LE1
CPU core Plain
Code model Near
Data model Small
асемблерный стартап
Код
#include "ionRF24LE1.h"
//------------------------------------------------------------------------------
PROGRAM start
//------------------------------------------------------------------------------
RSEG CODE
EXTERN main
PUBLIC reset
reset:
ljmp init
//------Инициализация-----------------------------------------------------------
init:
MOV PSW,#0x00
MOV SP,#0xBF
lcall main
exit:
ljmp exit
//------------------------------------------------------------------------------
END
//------------------------------------------------------------------------------
PROGRAM start
//------------------------------------------------------------------------------
RSEG CODE
EXTERN main
PUBLIC reset
reset:
ljmp init
//------Инициализация-----------------------------------------------------------
init:
MOV PSW,#0x00
MOV SP,#0xBF
lcall main
exit:
ljmp exit
//------------------------------------------------------------------------------
END
и собственно функция
Код
unsigned char d;
unsigned char summa(unsigned char a, unsigned char b, unsigned char c)
{
return a+b+c;
}
void main()
{
d = summa(10,20,30);
}
unsigned char summa(unsigned char a, unsigned char b, unsigned char c)
{
return a+b+c;
}
void main()
{
d = summa(10,20,30);
}
Без переменых только код ничего лишнего... обьявляю переменные в конце кода компилятор вставляет "__low_level_init" и прочее, которые никогда не используются!...
Отключал библиотеку CLIB в настройках без переменных проект собирается и с локальными переменными собирается, обьявляешь внешнюю переменную начинает ругаться:
Error[e46]: Undefined external "__INIT_IDATA_Z" referred in main ( D:\IAR projects\8051\test_asm\Debug\Obj\main.r51 )
Еще вечная ругня компилятора по поводу что ему не хватает стека при компиляции и в симуляторе.
Если есть возможность укажите что надо сделать, что почитать))) ломаю голову целую неделю...
