We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I started a new project with an LPC2106 cpu. There are two files in it: blinky.c and time.c In Blinky.c I declare: extern void init_time(void); And call it in the main function. Function is written in time.c When I link I get a undefined symbol report on init_time If I look at blinky.lst I can see a call to a external symbol called: "Z9init_timev" And if I look at time.lst I can see a global symbol "init_time" Anyone know what I am doing wrong???
Actually we have completed your example. It is available at: http://www.keil.com/download/files/lpc2100_blinky.zip Detailed information can be found in the Abstract.txt file that comes with the example. It is tested with the simulator (but should also run on real hardware). This example shows: - how to setup the Vector Interrupt controller. - how to setup timer0 for timer interrupts. - how to put the device into power-down mode.
The uppercase C was just asking for trouble, though; I'm not sure where that convention was used. On Unix, of course, where filenames are case-sensitive as god intended ;-) The way the Microsoft platforms treat letter case in filenames ("case-preserving, but not case-respecting") is atrocious, IMHO. It's a hysterical remnant from the original QDOS (and thus from CP/M) which has no business still remaining in all current incarnations of Windows today. They ought to have killed it in the first edition of NT, but they didn't. The DOS and Windows ports of GNU software (DJGPP, MinGW, cygwin) all faced this same problem at some time, and no-one found a better solution yet than the classic "Don't do that, then!" workaround. IMHO, Keil should put a catch for this into uVision. At least show a warning dialog if a file *.C is added to a project and offer to add it as *.c instead... Note that lower-casing all extensions unambiguously would be a bad plan because of the distinction between *.s and *.S. Keil ARM projects may well want to have *.S files in them!
But "Unix" is also the source of most if not all of those other extensions as well. There had to be some sub-culture that thought .C was a great idea. It's even more cute than .cxx. (See, the plus signs in .c++ are rotated 45 degress and become x's...) So I was wondering, which "Unix", or school? Is it AT&T thing, or Berkeley, or MIT, or Sun, or NeXT-ish? Relying only upon case to distinguish two identifiers is a poor design choice, IMO. I remember once having to deal with some code where the author liked to declare things "Static", which was of course variably #define'd to mean almost completely not what you thought it did. Or imagine filling up your 8051 code with references to "p0" and "ie" that are just ordinary data. Why doesn't "ResetCPUWatchdog()" do the same thing as "ResetCpuWatchdog()", and are you really going to remember that late at night before the deadline? Should "RM -f" (read memory, fast) really exist in your shell next to "rm -f"? There's a reason stricmp() and friends exist.
Looks like the example program from Keil support only runs on the simulator, not the real chip. There are no interrupts generated in real target.