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

Reply via email to