Я делаю ШИМ драйвер.И я написал подпрограмму прерывания с использованием ассемблера для скорости.честно говоря, я пересмотрел файл lss, созданный студией atmel.и я написал основной источник, используя Atmel Studio 7. Но в Atmel Studio нет функции объединения C ++ и ассемблера.И у него нет функции вставки объектного файла в опцию toolchain.Поэтому я компилирую и делаю ссылку в быстром режиме (Windows 10).Но я не могу получить желаемый результат.
- источник прерываний
#include <avr/io.h>
.global __vector_13
.extern INDEX_carrier_nth_section
.extern Mf
.extern TOP
.extern Io
.extern tick_rr
.extern Clock_Per_quarter_Cycle_of_Carrier
.extern PWM_duty_clocks
__vector_13:
push r0
in r0, 0x3f ; 63
push r1
eor r1, r1
......
......
C ++ source
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>
#include <stdlib.h>
#define F_CPU 16000000UL
#define NEWTON_ITER 3
#define U_LIMIT_Mf 601
#define Irm 3.0 // A
#define Vs 310.0 // V
#define Lr 20e-6 // H
#define Cr 1e-9 // F
....
....
ISR(TIMER1_COMPA_vect) //for debug
{
;
}
int main(void)
{
/* Replace with your application code */
full_length_of_power_clock = static_cast<long>(Mf)*Clock_Per_1_Cycle_of_Carrier;
half_length_of_power_clock = full_length_of_power_clock>>1;
quarter_length_of_power_clock = half_length_of_power_clock>>1;
TOP = Clock_Per_1_Cycle_of_Carrier/4;
get_pwm_dutys();
start_PWM();
......
......
, и я запускаю gcc
avr-gcc -mmcu=atmega328p -o main.o main.cpp
, и я запускаю ассемблер
avr-as -mmcu=atmega328p -o interrupt.o interrupt.asm
, а затем
avr-gcc -o pwm.elf main.o interrupt.o
Не было сообщения об ошибке.
, и я видел выходной файл по
avr-objdump -d pwm.elf
Он сказал
Disassembly of section .text:
00000000 <__ctors_end>:
0: 0c 94 44 00 jmp 0x88 ; 0x88 <__init>
4: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
8: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
c: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
10: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
14: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
18: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
1c: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
20: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
24: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
28: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
2c: 0c 94 6e 00 jmp 0xdc ; 0xdc <__vector_11>
30: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
34: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
38: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
3c: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
40: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
44: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
48: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
4c: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
50: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
54: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
58: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
5c: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
60: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
64: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__bad_interrupt>
68: 05 a8 ldd r0, Z+53 ; 0x35
6a: 4c cd rjmp .-1384 ; 0xfffffb04 <_ZL8tick_rcb+0xfefff984>
6c: b2 d4 rcall .+2404 ; 0x9d2 <__addsf3x+0x82>
6e: 4e b9 out 0x0e, r20 ; 14
70: 38 36 cpi r19, 0x68 ; 104
существует только TIMER1_COMPA_vect (__ vector_11).Нет __vector_13.
Чтобы обратиться к выводу студии atmel, я добавляю опцию --save-temps в студии atmel.И main.s от atmel похож на это.
.file "main.cpp"
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
.text
.Ltext0:
.cfi_sections .debug_frame
.section .text.__vector_11,"ax",@progbits
.global __vector_11
.type __vector_11, @function
__vector_11:
.LFB6:
.file 1 ".././main.cpp"
.loc 1 67 0
.cfi_startproc
push r1
Я изменяю код относительно __vector_13.
.text
.section .text.__vector_13,"ax",@progbits
.global __vector_13
__vector_13:
Но это не дает того, что я хочу.Кто-нибудь, помогите мне.