hi, is there anybody out there who can explain, how i can call c-code
from asm-code?
for tests i wrote some little code for my atmega8:
asm_code in atmel-avr-assembler:
.include "m8def.inc"
.include "test_c.c"
.def temp = r16
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
nop
nop
nop
RCALL test_c
nop
nop
c_code (external file named test_c.c):
#include <avr/io.h>
#include <stdio.h>
int main (void) {
DDRB = 0xff;
PORTB = 0x03;
PORTB = 0x07;
while(1) {
/* "empty*/
}
return 0;
}
if i try to build the asm-section, i get the following errors:
E:\elektronik\atmega8\c aus asm\test.c(1): error: Cannot find include
file: avr/io.h
E:\elektronik\atmega8\c aus asm\test.c(2): error: Cannot find include
file: stdio.h
E:\elektronik\atmega8\c aus asm\test.c(4): error: syntax error,
unexpected FUNCTION
what is wrong? do i have to compile the test.c first? but then i get
these files:
test_c.aps
test_c.aws
test_c.c
test_c.o
test_c.map
test_c.lss
test_c.eep
test_c.elf
test_c.hex
do i have to include one of them??
thanks for help!!!
1) Why would you want to do so 2) Looking at your code, I can see a lot of misinformation and gotchas 3) Start with either programming in assembler or programming in C. Calling assembler from C is something, that is rarely needed. But calling a C function from assembler is something you will not want to do. 4) you cannot include a C-code file into assembler. The assembler translates assembler code. Translating C-code files is the job of the compiler, not the assembler. The output of both independent jobs is then linked together to form the entire executable. 5) One calls functions, not files. Your function is named 'main', not 'test_c' 6) If you want to mix assembler with C, you have to play by the rules. The rules are made by the compiler, not by yourself. So you have to take care about things like register usage and stack calling conventions. 7) If, as a C programmer, you feel the need to do something in assembler, step back and look again. While there are sometimes things, that should be done in assembler for speed reasons, those things are seldome necessary but often show a lack of C or algorithmic knowledge. Those reasons often circle around pushing/poping registers in ISR-functions. Other then that, there seldom is a need for writing something in assembler when writing C programs. But when you do, it is most of the time: C calls assembler and not the other way round. 8) If you feel the need, that you have to do things before main starts, (in avr-gcc) there are documented functions you can inherit, which are called during the C-runtime startup process and which are the correct places you can hook into the startup process.
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.