Hi Pedro, in another mail-thread there are explained two ways of calling C functions from a nesC application. Check this: http://www.mail-archive.com/[email protected]/msg35149.html
The quick & dirty way is embedding the C function into the nesC file. I did it and works properly, but since it is not very flexible nor scalable I moved to the second option. The second option means to declare the function in a header file "source.h" and to indicate that the "source.c" file must be compiled into the Makefile as "PFLAGS+=path/to/source.c". In your case, I would remove the LDFLAGS and just try this Makefile: " COMPONENT=FloodingC include $(MAKERULES) PFLAGS += path_to_C_source/source.c " I hope it helps! Cheers! Sergio On Wed, Jan 12, 2011 at 5:57 AM, Pedro Nunes <[email protected]> wrote: > Hi all. > I'm also trying to use a C function inside my nesC application but there's a > problem I can't solve. > I edit the Makefile like David said: > ------------------ > COMPONENT=FloodingC > include $(MAKERULES) > LDFLAGS=/opt/tinyos-2.1.1/tos/system/sha1.o > /opt/tinyos-2.1.1/tos/system/sha1.c: /opt/tinyos-2.1.1/tos/system/sha1.h > $(CC) -o /opt/tinyos-2.1.1/tos/system/sha1.o > /opt/tinyos-2.1.1/tos/system/sha1.c > ------------------ > But whenever I try to build my application I always get this warning: > "gcc: /opt/tinyos-2.1.1/tos/system/sha1.o: linker input file unused because > linking not done" > I know this is happening because when I compiled sha1 I did "gcc -c sha1.c" > since sha1.c doesn't have a main function. But that's the purpose of it. I > don't want to run it as a stand-alone program. I just want to use it as a > library. > This warning will later lead me to this when running my simulation: > ------------------ > Traceback (most recent call last): > File "simulation.py", line 3, in <module> > from TOSSIM import * > File ".../Flooding/src/TOSSIM.py", line 7, in <module> > import _TOSSIM > ImportError: .../Flooding/src/_TOSSIMmodule.so: undefined symbol: SHA1Input > ------------------ > Does anyone know a way to fix this? > Thank you in advance. > Regards, > Pedro Nunes > >>OK! now it works, but only in simulation!!! >>I tried to edit my makefile but without success! >>How can I solve this problem? >>Thank you! >>2008/1/31, AIGroup <[EMAIL PROTECTED]>: >>> >>> Hi David, >>> >>> before all thank you for your help. >>> I tried to edit my files as you wrote, but I yet have problems. >>> I edited my nesc file as follows: >>> ----- >>> #include "Timer.h" >>> #include "Hello.h" //<------ I included the header file here >>> >>> module BlinkC >>> { >>> uses interface Timer<TMilli> as Timer0; >>> uses interface Timer<TMilli> as Timer1; >>> uses interface Timer<TMilli> as Timer2; >>> uses interface Leds; >>> uses interface Boot; >>> } >>> implementation >>> { >>> event void Boot.booted() >>> { >>> call Timer0.startPeriodic( 250 ); >>> call Timer1.startPeriodic( 500 ); >>> call Timer2.startPeriodic( 1000 ); >>> } >>> >>> event void Timer0.fired() >>> { >>> Hello(); //<-------------This is the function call to >>> Hello() >>> //dbg("BlinkC", "Timer 0 fired @ %s.\n", sim_time_string()); >>> //call Leds.led0Toggle(); >>> } >>> >>> -------- >>> The C files are these: >>> ----------- >>> //Hello.h >>> #ifndef HELLO_H >>> #define HELLO_H >>> >>> void Hello(); >>> >>> #endif >>> --------- >>> #include "Hello.h" >>> >>> void Hello() >>> { >>> printf("\nHELLO!\n"); >>> } >>> ------------- >>> and my Makefile is the following: >>> COMPONENT=BlinkAppC >>> LDFLAGS = Hello.o >>> Hello.c: Hello.h >>> $(CC) -o Hello.o Hello.c >>> include $(MAKERULES) >>> --- >>> where $(CC)... is "tabbed" >>> So, when I run "make micaz sim" this error occurs: >>> --------- >>> [EMAIL PROTECTED]:/opt/tinyos-2.x/apps/ImportC$ make micaz sim >>> mkdir -p build/micaz >>> placing object files in build/micaz >>> writing XML schema to app.xml >>> compiling BlinkAppC to object file sim.o >>> ncc -c -shared -fPIC -o build/micaz/sim.o -g -O0 -tossim >>> -fnesc-nido-tosnodes=1000 -fnesc-simulate >>> -fnesc-nido-motenumber=sim_node\(\) -finline-limit=100000 -Wall >>> -Wshadow >>> -Wnesc-all -target=micaz -fnesc-cfile=build/micaz/app.c -board=micasb >>> -DIDENT_PROGRAM_NAME=\"BlinkAppC\" -DIDENT_USER_ID=\"penguin\" >>> -DIDENT_HOSTNAME=\"penguin-laptop\" -DIDENT_USER_HASH=0xdef7cfbeL >>> -DIDENT_UNIX_TIME=0x47a18a21L -DIDENT_UID_HASH=0x77ab7dfaL >>> -Wno-nesc-data-race BlinkAppC.nc Hello.o -fnesc-dump=components >>> -fnesc-dump=variables -fnesc-dump=constants -fnesc-dump=typedefs >>> -fnesc-dump=interfacedefs -fnesc-dump=tags -fnesc-dumpfile=app.xml >>> gcc: Hello.o: No such file or directory >>> make: *** [sim-exe] Error 1 >>> ----- >>> How can I solve the problem??? >>> Thank you very much in advance for your precious help >>> Regards, >>> >>> Roberto >>> >>> >>> 2008/1/30, David Gay <[EMAIL PROTECTED]>: >>> > >>> > #include works fine, but, as in C, it's just textual inclusion (it >>> > really is nothing complicated ;-)). So it's all as if you just wrote: >>> > >>> > module ... >>> > implementation >>> > { >>> > #ifndef C_CODE >>> > #define C_CODE >>> > >>> > void Hello(); >>> > >>> > #endif >>> > >>> > event void Boot.booted() >>> > { >>> > call Timer0.startPeriodic( 250 ); >>> > } >>> > >>> > event void Timer0.fired() >>> > { >>> > Hello(); //Hello() is a function which is inside my C code >>> > } >>> > } >>> > >>> > which therefore just declares Hello() as an internal function inside >>> > BlinkC. >>> > >>> > In nesC, C functions must be declared before the module/implementation >>> > (or interface) part of a file. So what you wanted to do was: >>> > /* nesC code*/ >>> > #include "c_code.h" >>> > module ... >>> > implementation >>> > { >>> > >>> > event void Boot.booted() >>> > { >>> > call Timer0.startPeriodic( 250 ); >>> > } >>> > >>> > event void Timer0.fired() >>> > { >>> > Hello(); //Hello() is a function which is inside my C code >>> > } >>> > } >>> > >>> > On Jan 30, 2008 6:37 AM, AIGroup <[EMAIL PROTECTED]> wrote: >>> > > I believed... >>> > > include directive works well. I have problem to edit the Makefile in >>> > order >>> > > to compile also the C file. >>> > >>> > Yes, you then also of course need to compile and link with your C >>> > code. Several ways to do that... The easiest in this case at least is >>> > probably to add >>> > LDFLAGS = c_code.c >>> > to your Makefile, which should cause ncc to compile and link c_code.c >>> > with your nesC app. A slightly more traditional Makefile approach >>> > would have you add >>> > >>> > LDFLAGS = c_code.o >>> > c_code.c: c_code.h >>> > $(CC) -o c_code.o <your favourite flags> c_code.c >>> > >>> > to your Makefile... (don't cut & paste the text above, the character >>> > before $(CC) needs to be a tab to keep make happy, in this email it's >>> > some spaces...) >>> > >>> > David Gay >>> > >>> > >>> > > >>> > > >>> > > 2008/1/30, AIGroup <[EMAIL PROTECTED]>: >>> > > >>> > > > Hi all. >>> > > > I would like to include some routines in my nesC code as follows >>> > > (considering the BlinkApp for example): >>> > > > /* nesC code*/ >>> > > > implementation >>> > > > { >>> > > > #include "c_code.h" >>> > > > >>> > > > event void Boot.booted() >>> > > > { >>> > > > call Timer0.startPeriodic( 250 ); >>> > > > } >>> > > > >>> > > > event void Timer0.fired() >>> > > > { >>> > > > Hello(); //Hello() is a function which is inside my C code >>> > > > } >>> > > > } >>> > > > ------------------------- >>> > > > /*C code*/ >>> > > > /*c_code.h*/ >>> > > > >>> > > > #ifndef C_CODE >>> > > > #define C_CODE >>> > > > >>> > > > void Hello(); >>> > > > >>> > > > #endif >>> > > > >>> > > > --------------- >>> > > > /* c_code.c */ >>> > > > >>> > > > #include "c_code.h" >>> > > > >>> > > > void Hello() >>> > > > { >>> > > > printf("HELLO!\n") >>> > > > } >>> > > > --------------- >>> > > > Compilation terminate with success, but if i try to execute a >>> > simulation, >>> > > this following error occurs: >>> > > > undefined symbol: BlinkC$Hello >>> > > > How can I solve this problem? >>> > > > Thank you very much for your help! >>> > > > >>> > > > >>> > > > >>> > > > >>> > > >>> > > >>> > > _______________________________________________ >>> > > Tinyos-help mailing list >>> > > [email protected] >>> > > >>> > >>> > https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help >>> > > >>> > >>> >>> > _______________________________________________ > Tinyos-help mailing list > [email protected] > https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help > _______________________________________________ Tinyos-help mailing list [email protected] https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help
