Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR настройки линкера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
shrek
Добрый Вечер. Спасибо за помощь в аналогичной теме...
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


и собственно функция

Код
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);
     }


Без переменых только код ничего лишнего... обьявляю переменные в конце кода компилятор вставляет "__low_level_init" и прочее, которые никогда не используются!...
Отключал библиотеку CLIB в настройках без переменных проект собирается и с локальными переменными собирается, обьявляешь внешнюю переменную начинает ругаться:
Error[e46]: Undefined external "__INIT_IDATA_Z" referred in main ( D:\IAR projects\8051\test_asm\Debug\Obj\main.r51 )
Еще вечная ругня компилятора по поводу что ему не хватает стека при компиляции и в симуляторе.
Если есть возможность укажите что надо сделать, что почитать))) ломаю голову целую неделю... smile3046.gif
zltigo
QUOTE
Если есть возможность укажите что надо сделать, что почитать)))

Стандарт языка - глобальные переменные должны быть инициализированы. Хочется приключений? Объявляйте их неициализированными. Только ведбь им по любому придется какие-то значения присваивать, а это по любому код.
QUOTE (shrek @ Aug 15 2010, 19:14) *
(Думаю если тему поменять может что то изменится...)

Admin:
Устное замечание за нарушение правил п.3.2
shrek
Цитата
Admin:
Устное замечание за нарушение правил п.3.2


Виноват...

Цитата
Объявляйте их неициализированными. Только ведбь им по любому придется какие-то значения присваивать, а это по любому код.


Обьявлял... тоже самое...
С IAR ARM такого не было по разному обьявлял. Только мой код и ничего лишнего!
Но с IAR MCS-51 я "подружиться" не могу)))

Цитата
Хочется приключений?


maniac.gif приключения начались с момента когда главному конструктору стало необходимо освоение контроллера nRF24LE1. Выяснилось что он еще к тому же приобрел глюченые чипы (может быть полезной инфа у этих чипов с маркировкой "NRF AX" или "NRF A" (уже не помню) SPI в режиме slave не работает. В еррате не было этого. По заверению производителя "NRF B" рабочий)...
shrek
Только что попробывал разные варианты обьявления переменных. Внутри функций, внешние, глобальные. Все равно вставляет компилятор кусок кода
Код
//-------------------------------------------------
        MOV    PSW,#0x00
init:
0000AE 75 D0 00       MOV   PSW,#0x00
        MOV    SP,#0xBF
0000B1 75 81 BF       MOV   SP,#0xBF
        CLR    A
0000B4 E4             CLR   A
        lcall  main
0000B5 12 00 E4       LCALL main
        ljmp   exit
exit:
0000B8 02 00 B8       LJMP  exit
__low_level_init_call:
0000BB 12 00 D2       LCALL __low_level_init
0000BE B9 00 03       CJNE  R1,#0x00,0x00C3
0000C1 02 00 D2       LJMP  __low_level_init
__INIT_IDATA_Z:
0000C4 E4             CLR   A
0000C5 79 08          MOV   R1,#0x08
0000C7 78 01          MOV   R0,#0x01
0000C9 B8 00 02       CJNE  R0,#0x00,0x00CD
0000CC 80 04          SJMP  __low_level_init
0000CE F7             MOV   @R1,A
0000CF 09             INC   R1
0000D0 D8 FC          DJNZ  R0,0x00CE
__low_level_init:
0000D2 79 01          MOV   R1,#0x01
0000D4 22             RET
a:
0000D5 10 20 30       JBC   0x24.0,0x0107
void ifp_int(){}
ifp_int:
//-------------------------------------------------

в который PC никогда не заходит...
свой стартап

Код
#include "ionRF24LE1.h"
//------------------------------------------------------------------------------
        PROGRAM start
        EXTERN init_perif
        EXTERN rf_init
        EXTERN main
        EXTERN ifp_int
        EXTERN tf0_int
        EXTERN pof_int
        EXTERN tf1_int
        EXTERN uart_int
        EXTERN tf2_int
        EXTERN rfrdy_int
        EXTERN rfirq_int
        EXTERN spi_int
        EXTERN wuopirq_int
        EXTERN miscirq_int
        EXTERN tick_int
//------------------------------------------------------------------------------
        RSEG   CSTART

reset:        
        ljmp   init
//------Вектор прерывания IFP 0x0003--------------------------------------------        
        org    0x0003
        
        push   PSW
        push   A
        mov    A,#00h
        sjmp   start_int
//------Вектор прерывания TF0 0x000B--------------------------------------------          
        org    0x000B
        
        push   PSW
        push   A
        mov    A,#03h
        sjmp   start_int
//------Вектор прерывания POF 0x0013--------------------------------------------        
        org    0x0013
        
        push   PSW
        push   A
        mov    A,#06h
        sjmp   start_int
//------Вектор прерывания TF1 0x001B--------------------------------------------
        org    0x001B
        
        push   PSW
        push   A
        mov    A,#09h
        sjmp   start_int
//------Вектор прерывания UART 0x0023-------------------------------------------
        org    0x0023
        
        push   PSW
        push   A
        mov    A,#0Ch
        sjmp   start_int
//------Вектор прерывания TF2 0x002B--------------------------------------------
        org    0x002B
        
        push   PSW
        push   A
        mov    A,#0Fh
        sjmp   start_int
//------Вектор прерывания RFRDY 0x0043------------------------------------------
        org    0x0043
        
        push   PSW
        push   A
        mov    A,#12h
        sjmp   start_int
//------Вектор прерывания RFIRQ 0x004B------------------------------------------
        org    0x004B
        
        push   PSW
        push   A
        mov    A,#15h
        sjmp   start_int
//------Вектор прерывания SPI 0x0053--------------------------------------------
        org    0x0053
        
        push   PSW
        push   A
        mov    A,#18h
        sjmp   start_int
//------Вектор прерывания WUOPIRQ 0x005B----------------------------------------
        org    0x005B
        
        push   PSW
        push   A
        mov    A,#1Bh
        sjmp   start_int
//------Вектор прерывания MISCIRQ 0x0063----------------------------------------
        org    0x0063
        
        push   PSW
        push   A
        mov    A,#1Eh
        sjmp   start_int
//------Вектор прерывания TICK 0x006B-------------------------------------------
        org    0x006B
        
        push   PSW
        push   A
        mov    A,#21h
        sjmp   start_int
//------Обработка прерываний----------------------------------------------------
go_sub:
        jmp    @A+DPTR
start_int:
        push   DPH
        push   DPL
        mov    PSW,Rx_Bank3
        mov    DPTR,#0x008A
        lcall  go_sub
        pop    DPL
        pop    DPH
        pop    A
        pop    PSW
        reti        
//------Адреса функций прерываний-----------------------------------------------        
        org    0x008A
        
        ljmp   ifp_int
        ljmp   tf0_int
        ljmp   pof_int
        ljmp   tf1_int
        ljmp   uart_int
        ljmp   tf2_int
        ljmp   rfrdy_int
        ljmp   rfirq_int
        ljmp   spi_int
        ljmp   wuopirq_int
        ljmp   miscirq_int
        ljmp   tick_int
//------Инициализация-----------------------------------------------------------
init:
        MOV    PSW,#0x00
        MOV    SP,#0xBF
        CLR    A
        //lcall  init_perif
        //lcall  rf_init
        lcall  main
exit:  
        ljmp   exit
//------------------------------------------------------------------------------
        END


громоздкий к сожалению...

main.c biggrin.gif
Код
char d;
const char a = 0x10;
const char b = 0x20;
const char c = 0x30;

void main()
     {
     d = a + b + c;
     }


ну и прерывания
irq.c
Код
#include "ionRF24LE1.h"

//------------------------------------------------------------------------------
void ifp_int(){}
//------------------------------------------------------------------------------
void tf0_int(){}
//------------------------------------------------------------------------------
void pof_int(){}
//------------------------------------------------------------------------------
void tf1_int(){}
//------------------------------------------------------------------------------
void uart_int(){}
//------------------------------------------------------------------------------
void tf2_int(){}
//------------------------------------------------------------------------------
void rfrdy_int(){}
//------------------------------------------------------------------------------
void rfirq_int(){}
//------------------------------------------------------------------------------
void spi_int(){}
//------------------------------------------------------------------------------
void wuopirq_int(){}
//------------------------------------------------------------------------------
void miscirq_int(){}
//------------------------------------------------------------------------------
void tick_int(){}
//------------------------------------------------------------------------------


Вставляет свое аккурат между стартупом и irq.c... (мозг потихоньку припухает...)
Микрюков Вячеслав
Цитата(shrek @ Aug 16 2010, 13:03) *
Только что попробывал разные варианты обьявления переменных. Внутри функций, внешние, глобальные. Все равно вставляет компилятор кусок кода....


Вставляет свое аккурат между стартупом и irq.c... (мозг потихоньку припухает...)



Счастлииивые, уже мозг припухает, а я вот ещё не знаю чем писать прогу, чем в nRF24LE1 заталкивать. Не поделитесь информацией?
shrek
"Главный" купил кит я через него и заталкиваю) А так в даташите есть все команды для программирования по SPI можно попробовать написать самому программатор на чем либо и через ком порт или usb грузить в nRF wink.gif
Кит nRF6310. Я через ISP интерфейс на борту кита программирую все мои nRF24LE1. В том числе перепрошил модули RFD21737 и RFD21739. smile.gif правда получилось перепрошить только два) с остальными связываться кит не хочет).
Микрюков Вячеслав
Спасибо за поддержку, мне сейчас всё интересно на эту тему. Посмотрел киты, какие в продаже, чего то дороговато показалось. Вот такой вариант ещё есть - приобрести полноценный программатор ChipProg-ISP.
http://www.phyton.ru/pages/page72.html
Ну и конечно начать со среды по теме: IAR EW8051-751A, скачал но пока не разбирался, вроде с кряком.

Ещё есть предложение тему начать nRF24LE1 рядом с ARM,AVR,MSP430.
Микрюков Вячеслав
Цитата(shrek @ Aug 15 2010, 21:43) *
(может быть полезной инфа у этих чипов с маркировкой "NRF AX" или "NRF A" (уже не помню) SPI в режиме slave не работает. В еррате не было этого. По заверению производителя "NRF B" рабочий)...


Это заявление настораживает, мне что пришлют из Дельта Электроники?
shrek
Цитата
Это заявление настораживает, мне что пришлют из Дельта Электроники?

ну если slave spi использоваться не будет) остальное все работает)
Цитата
Ещё есть предложение тему начать nRF24LE1 рядом с ARM,AVR,MSP430.

ну вроде есть уже подфорум по контроллерам на базе 8051)
смысла нет там все тоже, но про nRF там очень мало...
shrek
Вчера заметил один глюк... (IAR MCS-51 V7.51)
Собрал проект, скомпилил, попробовал в симуляторе все вроде нормально. (галка стояла на оптимизации Low)
Прошиваю чип... не работает...
Должен раз в секунду мигать светодиодом по команде запуска, проверял генераторы, так как встроенный часовой RC генератор давал ощутимую погрешность, а имеется необходимость достаточно точно время отсчитывать. А иначе получится несогласование работы передатчиков.
Поставил галку на None...
Скомпилил, попробовал в симуляторе все вроде норм. Прошиваю чип не работает.
Поставил галку на Medium...
Скомпилил, попробовал в симуляторе все вроде норм. Прошиваю чип работает.
Поставил галку на High (Balanced)...
Скомпилил, попробовал в симуляторе все вроде норм. Прошиваю чип работает.
Код
#include "ionRF24LE1.h"
#include "rf_transceiver.h"

void delay(unsigned int j) {while (--j > 0);}

const unsigned char address[5] = {0xC3, 0xC3, 0xC3, 0xC3, 0xC3};
unsigned char buffer[5];

void main()
     {
     unsigned char i;
//------------------------------------------------------------------------------
     DIS_RF;
//---CONFIG---------------------------------------------------------------------
     rf_power_down();
     rf_crc_mode(CRC_8BIT);                    //CRC 8 бит
     rf_dis_irq(ALL_IRQ);                      //Выключаем все прерывания
     rf_en_irq(RX_DR);                         //Включаем прерывание по приему
     rf_prx_mode();                            //устанавливаем приоритетный режим передачи данных
//---EN_AA----------------------------------------------------------------------
     rf_dis_aa(ALL_PIPE);                      //выключаем Enhanced ShockBurst для всех каналов
//---EN_RXADDR------------------------------------------------------------------
     rf_dis_rxaddr(ALL_PIPE);                  //выключаем адреса для всех каналов
     rf_en_rxaddr(PIPE_0);                     //включаем адрес для канала 0
//---SETUP_AW-------------------------------------------------------------------
     rf_setup_aw(AW_5BYTES);                   //устанавливаем ширину адреса в 5 байт
//---SETUP_RETR-----------------------------------------------------------------
     rf_write_reg(SETUP_RETR, 0x00);           //устанавливаем счетчик авторетрансляции в 0
//---RF_CH----------------------------------------------------------------------
     rf_set_channel(0x3);                      //устанавливаем частотный канал 3
//---RF_SETUP-------------------------------------------------------------------
     rf_set_rate(RATE_250KBPS);                //устанавливаем битрейт 250 кбит/с
//------------------------------------------------------------------------------
     i = 5;
     while (i--) buffer[i] = address[i];
     rf_write_multibyte_reg(RX_ADDR_P0, buffer, 5); //устанавливаем адрес канала 0 для приема
//---RX_PW_P0-------------------------------------------------------------------
     rf_write_reg(RX_PW_P0, 4);                //устанавливаем фиксированное число байт приема канала 0
//---DYNPD----------------------------------------------------------------------
     rf_dis_dynpd(ALL_PIPE);                   //выключаем динамическую длинну данных для всех каналов
//---FEATURE--------------------------------------------------------------------
     rf_write_reg(FEATURE, 0x00);              //выключаем все прочие функции
//---CONFIG---------------------------------------------------------------------
     rf_power_up();                            //переводим в режим stantby-I
     delay (200);
     //RTC2CON = Comp_res | RTC2_en;
     IEN1 = RF_int | Tick_int;                 //прерывание от RF
     T2CON = 0;
     IEN0 = En_all_int;
     EN_RF;
//------------------------------------------------------------------------------
     while(1);
     }

Опытным путем установил что чип останавливается или уходит в ребут или в бесконечном цикле на
Код
i = 5;
     while (i--) buffer[i] = address[i];

или
Код
rf_write_multibyte_reg(RX_ADDR_P0, buffer, 5);
MrYuran
Цитата(shrek @ Sep 1 2010, 08:02) *
Опытным путем установил что чип останавливается или уходит в ребут или в бесконечном цикле на
Код
i = 5;
     while (i--) buffer[i] = address[i];

или
Код
rf_write_multibyte_reg(RX_ADDR_P0, buffer, 5);

Надо смотреть листинг рабочей прошивки и нерабочей в этом месте.
Искать 10 отличий.
Долго думать.
shrek
Хотя в симуляторе и та и та работает))))
Микрюков Вячеслав
Установил IAR EW8051-751A, файл "ionRF24LE1.h" найти не могу. А что ещё надо установить для nRF24LE1?
shrek
Ну если есть кит от nRF, то на оффсайте можно прогу скачать nRFgo Studio и еще на оффсайте можно скачать библиотеки для nRF24LE1 nRFgo SDK v2.1. А так кроме в принципе иара ниче не понадобится.
ionRF24LE1.h лежит в "Ваша папка с IARом"\8051\inc\
Палыч
Цитата(Микрюков Вячеслав @ Sep 2 2010, 13:27) *
Установил IAR EW8051-751A, файл "ionRF24LE1.h" найти не могу.
Всегда удевляло, что для программирования МК51 кто-то использует IAR, а не Keil... Почему? Какие доводы?
demiurg_spb
Цитата(Палыч @ Sep 2 2010, 15:38) *
Всегда удевляло, что для программирования МК51 кто-то использует IAR, а не Keil... Почему? Какие доводы?
Сила привычки видимо. Другое объяснение тут вряд-ли возможно.
shrek
Цитата
Сила привычки видимо. Другое объяснение тут вряд-ли возможно.


Вы правы))))
Микрюков Вячеслав
Цитата(Палыч @ Sep 2 2010, 15:38) *
Всегда удевляло, что для программирования МК51 кто-то использует IAR, а не Keil... Почему? Какие доводы?

В Keil симулятор нормально, всё железо симулирует? В данном случае nRF24LE1.
Палыч
Цитата(Микрюков Вячеслав @ Sep 3 2010, 14:58) *
В Keil симулятор нормально, всё железо симулирует? В данном случае nRF24LE1.
Для Вашего микроконтроллера - нет, не всё. Подробности здесь. Если что-то очень нужно, то в симулятор можно добавить "свою" периферию, но это - для "продвинутых" пользователей...
Микрюков Вячеслав
Цитата(Палыч @ Sep 3 2010, 18:29) *
Для Вашего микроконтроллера - нет, не всё. Подробности здесь. Если что-то очень нужно, то в симулятор можно добавить "свою" периферию, но это - для "продвинутых" пользователей...

Кстати, симулятор Keil C51 v 9.02a поддерживает nRF24LE1, только что обнаружил. У меня привычки к IAR нет, по этому на Keil перехожу.
Палыч
Цитата(Микрюков Вячеслав @ Sep 11 2010, 20:39) *
Кстати, симулятор Keil C51 v 9.02a поддерживает nRF24LE1
Поддерживать - поддерживает, но только ту периферию, что совпадает с классическим МК51
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.