реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> IAR настройки линкера, Как сделать чтобы линкер не вставлял библиотечные модули
shrek
сообщение Aug 15 2010, 17:14
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Добрый Вечер. Спасибо за помощь в аналогичной теме...
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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 15 2010, 17:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE
Если есть возможность укажите что надо сделать, что почитать)))

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
shrek
сообщение Aug 15 2010, 17:43
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



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


Виноват...

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


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

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


maniac.gif приключения начались с момента когда главному конструктору стало необходимо освоение контроллера nRF24LE1. Выяснилось что он еще к тому же приобрел глюченые чипы (может быть полезной инфа у этих чипов с маркировкой "NRF AX" или "NRF A" (уже не помню) SPI в режиме slave не работает. В еррате не было этого. По заверению производителя "NRF B" рабочий)...

Сообщение отредактировал shrek - Aug 15 2010, 18:14
Go to the top of the page
 
+Quote Post
shrek
сообщение Aug 16 2010, 09:03
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Только что попробывал разные варианты обьявления переменных. Внутри функций, внешние, глобальные. Все равно вставляет компилятор кусок кода
Код
//-------------------------------------------------
        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, 09:09
Go to the top of the page
 
+Quote Post
Микрюков Вячесла...
сообщение Aug 25 2010, 10:09
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 21-08-10
Из: Набережные Челны
Пользователь №: 59 037



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


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



Счастлииивые, уже мозг припухает, а я вот ещё не знаю чем писать прогу, чем в nRF24LE1 заталкивать. Не поделитесь информацией?
Go to the top of the page
 
+Quote Post
shrek
сообщение Aug 27 2010, 03:34
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



"Главный" купил кит я через него и заталкиваю) А так в даташите есть все команды для программирования по SPI можно попробовать написать самому программатор на чем либо и через ком порт или usb грузить в nRF wink.gif
Кит nRF6310. Я через ISP интерфейс на борту кита программирую все мои nRF24LE1. В том числе перепрошил модули RFD21737 и RFD21739. smile.gif правда получилось перепрошить только два) с остальными связываться кит не хочет).
Go to the top of the page
 
+Quote Post
Микрюков Вячесла...
сообщение Aug 28 2010, 04:53
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 21-08-10
Из: Набережные Челны
Пользователь №: 59 037



Спасибо за поддержку, мне сейчас всё интересно на эту тему. Посмотрел киты, какие в продаже, чего то дороговато показалось. Вот такой вариант ещё есть - приобрести полноценный программатор ChipProg-ISP.
http://www.phyton.ru/pages/page72.html
Ну и конечно начать со среды по теме: IAR EW8051-751A, скачал но пока не разбирался, вроде с кряком.

Ещё есть предложение тему начать nRF24LE1 рядом с ARM,AVR,MSP430.
Go to the top of the page
 
+Quote Post
Микрюков Вячесла...
сообщение Aug 28 2010, 06:08
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 21-08-10
Из: Набережные Челны
Пользователь №: 59 037



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


Это заявление настораживает, мне что пришлют из Дельта Электроники?
Go to the top of the page
 
+Quote Post
shrek
сообщение Aug 29 2010, 06:23
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



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

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

ну вроде есть уже подфорум по контроллерам на базе 8051)
смысла нет там все тоже, но про nRF там очень мало...
Go to the top of the page
 
+Quote Post
shrek
сообщение Sep 1 2010, 04:02
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Вчера заметил один глюк... (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);


Сообщение отредактировал shrek - Sep 1 2010, 04:09
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 1 2010, 04:57
Сообщение #11


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

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

Надо смотреть листинг рабочей прошивки и нерабочей в этом месте.
Искать 10 отличий.
Долго думать.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
shrek
сообщение Sep 1 2010, 16:59
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Хотя в симуляторе и та и та работает))))
Go to the top of the page
 
+Quote Post
Микрюков Вячесла...
сообщение Sep 2 2010, 09:27
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 21-08-10
Из: Набережные Челны
Пользователь №: 59 037



Установил IAR EW8051-751A, файл "ionRF24LE1.h" найти не могу. А что ещё надо установить для nRF24LE1?
Go to the top of the page
 
+Quote Post
shrek
сообщение Sep 2 2010, 10:13
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Ну если есть кит от nRF, то на оффсайте можно прогу скачать nRFgo Studio и еще на оффсайте можно скачать библиотеки для nRF24LE1 nRFgo SDK v2.1. А так кроме в принципе иара ниче не понадобится.
ionRF24LE1.h лежит в "Ваша папка с IARом"\8051\inc\
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 2 2010, 11:38
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Микрюков Вячеслав @ Sep 2 2010, 13:27) *
Установил IAR EW8051-751A, файл "ionRF24LE1.h" найти не могу.
Всегда удевляло, что для программирования МК51 кто-то использует IAR, а не Keil... Почему? Какие доводы?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 05:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01543 секунд с 7
ELECTRONIX ©2004-2016