I forgot to mention that you should #include "source.h" in your "source.c" as it is obvious ;-)
On Wed, Jan 12, 2011 at 11:30 AM, Sergio Valcarcel <[email protected]> wrote: > 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
