SSV-RSCE (03.02.2004 21:19, просмотров: 2242)
Нецелочисленное деление в ADS + выбор компилятора Здравствуйте! Не подскажите, нужно ли в данном программном пакете подключать дополнительные библиотеки (fplib или др.) или что-либо инициализировать для деления float чисел? У меня программа при выполнении деления вылетает в начало main(),умножение, сложение и вычитание работают нормально. Деление корректно(не на ноль, в упрощённом случае даже конечно a=10/4) (я определяю место выполнения программы зажигая светодиоды на железяке (контроллер на процессоре TRISCEND A7)).
Посоветуйте какой из компиляторов лучше ипользовать ADS или Green Hill Multy2000? Основная задача программы, вычислять значения выражений по сложным формулам (много корней и операций деления).
Если можно приведите небольшой пример (деление и квадр. корень) на одном из компиляторов. Извините за объёмное сообщение.
Cпасибо за ответы
Часть программы:
файл C++
====================================================================
#include
#include "../Start.h"
#include "../triscend_a7.h"
#include
unsigned int IntCount;
void delay(long int);
void __irq IRQ_Handler (void)
{
*(unsigned int*)TIMER0_CLEAR_REG = 1;
if(IntCount & 0x01)
*(volatile unsigned char * ) CommandReg &= 0xFD;
else
*(volatile unsigned char* ) CommandReg |= 0x02 ;
IntCount++;
}
int main(void)
{ int i;
volatile float a, b;
for (i=2;i<7;i++)
{
b = 2.32;
a = i / b;//здесь программа вылетит в начало main()
}
.............
здесь программа выполнятся не будет
............
}
================================================
файл на Aсемблере
================================================
; получаем доступ к символам от линкера
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialise
; область startup, должна идти первой, используется
AREA cstartup, CODE, READONLY
EXPORT _start
_start
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
IMPORT IRQ_Handler
Reset_Addr DCD Reset_Handler
Undefined_Addr DCD Undefined_Handler
SWI_Addr DCD SWI_Handler
Prefetch_Addr DCD Prefetch_Handler
Abort_Addr DCD Abort_Handler
DCD 0 ; Reserved vector
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
Undefined_Handler
B Undefined_Handler
SWI_Handler
B SWI_Handler
Prefetch_Handler
B Prefetch_Handler
Abort_Handler
B Abort_Handler
FIQ_Handler
B FIQ_Handler
Reset_Handler
IRQ_STACK_SIZE EQU 64
FIQ_STACK_SIZE EQU 64
ABT_STACK_SIZE EQU 1
UND_STACK_SIZE EQU 1
msr cpsr_c, #0xd1
ldr sp, =0xd1034000
sub r0, sp, #FIQ_STACK_SIZE
msr cpsr_c, #0xd2
mov sp, r0
sub r0, sp, #IRQ_STACK_SIZE
msr cpsr_c, #0xd7
mov sp, r0
sub r0, sp, #ABT_STACK_SIZE
msr cpsr_c, #0xdb
mov sp, r0
sub r0, sp, #UND_STACK_SIZE
msr cpsr_c, #0xd3
mov sp, r0
; перезапись на новое место инициализированных переменных
ldr r0, = |Image$$RO$$Limit|
ldr r1, =|Image$$RW$$Base|
ldr r2, =|Image$$ZI$$Base|
rwcopy
subs r3, r2, r1
beq zicreate
subs r3, r3, #32
ldmplia r0!, {r4-r11}
stmplia r1!, {r4-r11}
ldrmi r3, [r0], #4
strmi r3, [r1], #4
b rwcopy
; создание секции с обнуленными переменными
zicreate
ldr r2, =|Image$$ZI$$Limit|
mov r0, #0;
ziloop
cmp r2, r1
strcc r0, [r1], #4
bcc ziloop
; разрешение прерываний
msr cpsr_c, #0x13
; переход на выполнение в С
IMPORT main
B main
END
==================================================