|
|
View previous topic :: View next topic |
Author |
Message |
richard_m
Joined: 28 May 2009 Posts: 3
|
Global variables with multiple compilation units |
Posted: Thu May 28, 2009 4:14 am |
|
|
I'm not sure if I'm doing this wrong or it's a bug, but I can't get global variables to work. They seem to be addresses as if packed in the wrong order in the file where they aren't defined, even though the declaration is in the same order. Surely the linker should fill in the memory addresses in both files the same way after relocating them if it moves them to align the 16 bit values for better packing?
Compiler is PCWHDD 4.069
Target is PIC 18f4680
Project Options:
Source files : main.o, sub.o
Multiple Compilation Units is ticked.
Link Separately is ticked.
header.h:
Code: |
#include <18F4680.h>
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#use delay(clock=32000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
extern int8 a ;
extern int16 b ;
extern int8 c ;
extern int16 d ;
void subproc();
|
main.c:
Code: |
#include "header.h"
int8 a = 0x01;
int16 b = 0x0203;
int8 c = 0x04;
int16 d = 0x0506;
void main() {
delay_ms(500); // let clock stabilise
// prints "a=01 b=0203 c=04 d=0506"
printf("a=%x b=%x%x c=%x d=%x%x \r\n",
a, make8(b, 1) , make8(b, 0),
c, make8(d, 1) , make8(d, 0));
subproc();
delay_ms(500); // wait for buffer to empty
}
|
sub.c:
Code: |
#include "header.h"
void subproc() {
// prints "a=05 b=0503 c=57 d=0000"
printf("a=%x b=%x%x c=%x d=%x%x \r\n",
a, make8(b, 1) , make8(b, 0),
c, make8(d, 1) , make8(d, 0));
}
|
|
|
|
Ttelmah Guest
|
|
Posted: Thu May 28, 2009 4:53 am |
|
|
The problem is including 'header', in the first unit.
Adding the extern declaration to the first unit, tells the compiler to consider these variables as declared in another unit. That it gets confused then, is not surprising....
Best Wishes |
|
|
richard_m
Joined: 28 May 2009 Posts: 3
|
|
Posted: Thu May 28, 2009 5:22 am |
|
|
Ok, fair enough (although I've seen it done that way with other compilers), now I've separated out the externs into a separate header file that's only included by sub.c. But still the same :(
header.h
Code: | #include <18F4680.h>
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#use delay(clock=32000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
void subproc();
|
globals.h:
Code: | extern int8 a ;
extern int16 b ;
extern int8 c ;
extern int16 d ;
|
sub.c:
Code: | #include "header.h"
#include "globals.h"
void subproc() {
// prints "a=05 b=0503 c=57 d=0000"
printf("a=%x b=%x%x c=%x d=%x%x \r\n",
a, make8(b, 1) , make8(b, 0),
c, make8(d, 1) , make8(d, 0));
}
|
main.c:
Code: | #include "header.h"
int8 a = 0x01;
int16 b = 0x0203;
int8 c = 0x04;
int16 d = 0x0506;
void main() {
delay_ms(500); // let clock stabilise
// prints "a=01 b=0203 c=04 d=0506"
printf("a=%x b=%x%x c=%x d=%x%x \r\n",
a, make8(b, 1) , make8(b, 0),
c, make8(d, 1) , make8(d, 0));
subproc();
delay_ms(500); // wait for buffer to empty
}
|
|
|
|
apcaye
Joined: 22 May 2009 Posts: 29 Location: Brazil
|
|
Posted: Fri May 29, 2009 7:25 am |
|
|
Are you using MPLAB IDE? You have to include only main.c in the Source Files section (Project window). In CCS compiler, you have to concentrate everything in the main source code file. I wouldn't use the external declarations, I would define all globals directly in main.c and after that include the file sub.c. I would suggest you also to include header.h only once in your project, it could be also a source of compiling errors.
Regards,
Adriano. |
|
|
richard_m
Joined: 28 May 2009 Posts: 3
|
|
Posted: Thu Jun 04, 2009 2:11 am |
|
|
I'm using CCS PCWHD IDE version 4.069.
It's all very well sticking everything in the one file if you're dealing with a very simple, hobbyist type of project, but the code I'm working with is much more complicated than that. I appreciate the suggestions of ways to work around the bugs, but I really feel they ought to get fixed :)
The CCS compiler has the option of using multiple compilation units, so they *should* work. It does have a tendancy to do weird things like #include .c files, and because of that I have problems, but I can work them out if the compiler would at least generate valid code.
But it seems that the normal way of writing code, ie separately compiled .c files then linking the .o files together is not well used by the average user of this compiler as they are mostly beginners trying to do simple stuff. So CCS doesn't notice the bugs.. I will get onto them now I know I am not trying to do something non-standards compliant.
Thanks, it helps to know why I am having this problem :) |
|
|
apcaye
Joined: 22 May 2009 Posts: 29 Location: Brazil
|
|
Posted: Tue Jun 09, 2009 6:27 am |
|
|
I also have multiple-unit projects and I have to organize my projects differently from the standard C because of the particularities of CCS compiler. I have indeed to #include .c files in the main project file. It works, although it's not standard. I don't believe that CCS is going to change its compiler to be standard compliant now that it is on version 4...
Good luck with your project,
Adriano. |
|
|
Guest
|
Is there any chance to get a good example |
Posted: Wed Jun 17, 2009 1:43 am |
|
|
I'm coming from the standard C world. I'm really frustrated because CCS seems not to support standard multiple file linking.
But I need to do this. I always get crazy things (without any warning).
Does anyone have a good example to see how to deal with more than four files? The sample CCS gives, is a little rare. It can't be seen how this really should be done. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Wed Jun 17, 2009 4:39 am |
|
|
I didn't yet test the "multiple compilation units" feature. If the term isn't completely meaningless respectively misleading, it would designate a technique, where the other source files are not included into main.c, which is the standard CCS single compilation unit method. Also, I would expect extern variables to work with.
Otherwise it can be simply added to the list of anounced and currently unsupported CCS C features (as e.g. fixed point types). |
|
|
apcaye
Joined: 22 May 2009 Posts: 29 Location: Brazil
|
|
Posted: Wed Jun 17, 2009 11:40 am |
|
|
Hi Guest,
I don't believe anybody is going to give you an example, because multiple-unit projects are usually complex and they involve company privacy. I would suggest that you try to do it yourself and ask us or CCS support if you get into trouble.
I checked at CCS site, they should support multiple unit compilation, although I have never tested it. Check this link:
http://www.ccsinfo.com/content.php?page=linker
Regards,
Adriano. |
|
|
Guest
|
Is there any chance to get a good example |
Posted: Thu Jun 18, 2009 2:45 pm |
|
|
Hi Adriano,
Thanks for your reply.
I did know what CCS wrote. Because of this I did buy the CCS IDE(4.xx).
The point is, CCS promises that you are able to link multiple files together. But if you did use extern vars strange things will happen. I tried to do it like it was at the CCS sample. But it did only work for two modules. The third was not able to reach the extern var. For the compiler it was a totally new var.
Now I gave up (totally frustrated). I think they shouldn't promise things which really do not work. If it worked they should give proper examples to see how a good pic style CCS code should being done.
I now do the same I did in the past with CCS --> single code style.
Thanks. Maybe some other users will find a solution. I'm out of my time to look for it.
Thanks
Otto |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Thu Jun 18, 2009 3:50 pm |
|
|
I tried to compile the example provided by richard_m, but it failed with
Function used but not defined for subproc() in main.c.
I understand the said description of multiple compilations units in the way, that the unit sub.c would be imported automatically. |
|
|
apcaye
Joined: 22 May 2009 Posts: 29 Location: Brazil
|
|
Posted: Fri Jun 19, 2009 6:53 am |
|
|
You're welcome, Otto. In case no other user helps you, I would recommend you send an e-mail to CCS technical support. They usually answer quickly, in the same day when possible. You can attach your project files for them to analyse.
Best regards,
Adriano. |
|
|
gilavar
Joined: 03 Mar 2009 Posts: 24
|
|
Posted: Fri Jun 19, 2009 10:59 am |
|
|
I am not very good at C at all, but I think you should declare variables in one unit and then use extern on every unit you are trying to access it from. It looks like in your code it is other way around. |
|
|
[email protected] Guest
|
Re: Is there any chance to get a good example |
Posted: Sun Aug 16, 2009 3:37 am |
|
|
Facing similar problems. I am dealing with C for the past 12 yrs. never found a compiler except CCS, where extern variable doesn't work in the manner it's meant for. Getting frustrated.
Anonymous wrote: | Hi Adriano,
Thanks for your reply.
I did know what CCS wrote. Because of this I did buy the CCS IDE(4.xx).
The point is, CCS promises that you are able to link multiple files together. But if you did use extern vars strange things will happen. I tried to do it like it was at the CCS sample. But it did only work for two modules. The third was not able to reach the extern var. For the compiler it was a totally new var.
Now I gave up (totally frustrated). I think they shouldn't promise things which really do not work. If it worked they should give proper examples to see how a good pic style CCS code should being done.
I now do the same I did in the past with CCS --> single code style.
Thanks. Maybe some other users will find a solution. I'm out of my time to look for it.
Thanks
Otto |
|
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1933 Location: Norman, OK
|
|
Posted: Sun Aug 16, 2009 9:17 pm |
|
|
I was able to successfully compile and link the program doing the
following:
I located the file mcu.zip in the PICC Examples folder and
extracted the file MCU Documentaiton.PDF.
I renamed your header.h file to header.c (a quirk in the compiler made it
want to look for a .c file when I built main.c)
I added the following lines in sub.c
extern int8 a;
extern int16 b;
extern int8 c;
extern int16 d;
I removed the variable and subproc() definitions from the header file and
left the primary definitions in main.c.
I modified the subproc() definition in main.c to external:
extern void subproc();
Using page 3 of the PDF I individually compiled each of the modules
then used Build from the Compile menu to link the files to a .hex file.
(make to check Multiple Compilation Units on the project Options screen)
The program linked successfully and created the .hex file. _________________ Google and Forum Search are some of your best tools!!!! |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|