ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
6340
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 ==================================================