Programming in C

A good toolchain to learn C on avr is the Code::Blocks + winavr combo.

dhenry has skipped over a few things here.

The standard included libraries initialize the timers, and in particular sets up Timer 0 so that it "ticks" every 1.024 mS, which is then used by the millis(), micros() and delay() function calls.

So if you were to totally bypass the IDE you would have to do that yourself. The init() function in the Arduino library is the one that does that. The file (wiring.c) also includes an interrupt handler to count those ticks.

However the answers above are correct. The Arduino "sketch" is treated as a C++ program (after a bit of text munging), so anything you can do in C++ you can do on the Arduino. Some compiler options disable some things, however, such as exception handling.

You are free to create new "tabs" in the IDE, and name your files xxx.c or xxx.cpp, giving you the ability to code in "straight" C or C++. Again, within the constraints of what compiler options are enabled, and what the included libraries allow. For example, the standard library does not let you write to stdout, because such a concept doesn't really exist on the microprocessor.

[quote author=Nick Gammon link=topic=133761.msg1006608#msg1006608 date=1353647354]For example, the standard library does not let you write to stdout, because such a concept doesn't really exist on the microprocessor.
[/quote]
unless you do this... http://arduino.cc/forum/index.php/topic,120440.0.html

Very nifty. However that's why I used the words "standard library". You can do all sorts of fancy things if you include the right libraries. That's one of its strengths. :slight_smile:

Right through from my childhood, my introductions & interests in engineering and concequently my education up until this point have all been in a mechanical discipline.

I'm in my final year of my Bachelors in an Automotive Mechanical degree right now actually - but over the last two and half years, my work has all been data & engine control engineering in motorsport with both a winning British GT team & BTCC team, and truthfully - my interests in a mechanical career are fading somewhat whilst an electronics career is looking ever more appealing.

I'm working as we speak on the hardware for a 2 cylinder ECU based around a 1284P, that supports dual wideband lambda, dual thermocouples, fly by wire throttle, extensive GP I/O, inductive & smart coil drive, saturated and peak & hold injector drive, USB - Serial etc... Most of the hardware knowledge has come from work, but as a personal project - I'm looking to first run a 2 cylinder generator as the test bed (by the time I get to the stage of working code I'll have left uni and won't have access to small dynos anymore) before running a 2 cylinder or twin engined kart with it, incorporating traction control, multi-mapping etc. Future hardware plans include comms protocols such as CAN etc.

Most of my work on clients vehicles has been with Pectel ECUs, second only to the likes of McLaren's TAG ECUs - so have extensive knowledge of how specific strategies are implemented for real world motorsport use, but am now incredibly interested in actually developing the code behind such strategies - as every now and then, would have liked the option of a somewhat different approach with a specific strategy, certainly for transient conditions.

Apologies for the life story, but hopefully it'll allow a better understanding of what I'm trying to learn for future use.

For a successful career in embedded programming, you need two things:

  1. a good understanding of C: structure and write bug-free code;
  2. ability to read and understand datasheets: 90% of programming a mcu is to operate those registers.

The stock C-functions are not that helpful.

When you say C: structure, are you referring to the structure of a typical C: drive on a PC? The colon makes me think so.

jtw11:
I believe the Arduino language is a type of C++

No, it is C++.

OTOH the style of programming you do on the Arduino isn't the style of C++ programming you should use on desktop machines. On desktops you should be worrying about "RAII". On the Arduino most things are statically created/allocated - you're controlling a dozen output pins, not reading data into memory for processing.

Fungus, I don't follow the logic of your post? I don't intend on programming C++ on a PC, all on MCUs?

Maybe it was my post about C: on PCs that misled you into thinking that? Dhenry had said one needed a good understanding of C: structure, and the colon made me thought he was referring to the structure of the C: directory of a PC, hence asking for clarification as I could not see how this was all so relevant.

I took the colon to be a mistype for a semicolon, and the word "structure" was to be used as a verb.

Ah.

I think the best plan of action from here - is probably to take some programs I've written in the Arduino IDE that I know work and do as I wish them to, and then rewrite them in plain C, get them to work. Then C++ without all the auto initialisation of the Arduino IDE.

For a successful career in embedded programming

Here, dhenry has missed the key demographic, and the raison d'être of the Arduino community.

Given that, as established earlier, the Arduino is programmed in C++ and that the transformation from a program using setup and loop to one using main is trivial, I think you're worrying too much. Any coding you do using the Arduino IDE is directly relevant to building your C++ experience - the functions you write would look the same whichever skeleton they use to get invoked. If you're going to be working with other platforms, you might want to get used to direct port access and bit twiddling, but even there, you can write your own wrapper functions (if they don't already exist) if they're fast enough.

In short, don't be so concerned about whether it's 'pure' C++ and get down to some coding instead :stuck_out_tongue:

jtw11:
Fungus, I don't follow the logic of your post? I don't intend on programming C++ on a PC, all on MCUs?

You were thinking of "adding C++ to your portfolio"...

Using Arduino-style C++ on a desktop would be as disastrous as using desktop-style C++ on an Arduino. You might want to qualify it in your resume.

Ah, Fungus - I see your point. Advertising oneself as being able to code C++ could lead to a rather awkward moment so to speak when sat down and asked to code a PC based C++ program, as opposed to a MCU program in C++.

I need to have a good look through now all the library functions that make up the digitalWrites, analogWrites, serial prints etc. Many thanks for all input thus far.

If you're going to be working with other platforms, you might want to get used to direct port access and bit twiddling, but even there, you can write your own wrapper functions (if they don't already exist) if they're fast enough.

This is what I want to achieve - to be able to program an AVR MCU using Atmel Studio for example, in the future - without any mention of Arduino. I almost feel bad saying that - given the platform introduced me so nicely :slight_smile:

wildbill:
Any coding you do using the Arduino IDE is directly relevant to building your C++ experience - the functions you write would look the same whichever skeleton they use to get invoked

The way I view it, "writing a program" is really more like "writing a custom library so that main() is small and neat".

When you say C: structure, are you referring to the structure of a typical C: drive on a PC?

It is about your ability to break down a complex task into well defined pieces so that when they are re-assembled, they work flawlessly together. That's where the money is, besides creativity.

dhenry:

When you say C: structure, are you referring to the structure of a typical C: drive on a PC?

It is about your ability to break down a complex task into well defined pieces so that when they are re-assembled, they work flawlessly together. That's where the money is, besides creativity.

Hmmm.... that requires creativity, too (often). :slight_smile:

It is about your ability to break down a complex task into well defined pieces so that when they are re-assembled, they work flawlessly together. That's where the money is, besides creativity.

That's exactly what I'm doing now - just documenting program flow charts, that define exactly what must happen, and when - saving on RAM using is high on the priority list with this project, and thus all terms are controlled as to when they refresh or are recalculated.

From the arduino.cc home page:

The microcontroller on the board is programmed using the Arduino programming language (based on Wiring) and the Arduino development environment (based on Processing).

Now, we all know that description by "Team Arduino" is a bit of stretch -- the "Arduno Language", if it exists, is a certain amount of IDE preprocessing of the .pde/.ino "sketch" files that convert certain non-C++ Arduino specific stuff into "real" C++ that the g++ compiler can actually compile.

But it should be made clear that when you program in the Arduino IDE, there are enough differences that mean the syntax and semantics depart from standard C++ (in particular, the the C/C++ preprocessor), and these can lead to unexpected (and sometimes inconsistent) results that can be confusing to anyone who has actually programmed in C/C++ before.

Perhaps calling the "Arduino Language" an attempt at a simplified "dialect" of C/C++ is a fairer description?

I just think of the differences as simply "broken", mostly. But the "team" will say that substituting the standard keyword "bool" with "boolean", and saving the user from having to declare their own function prototypes, and hiding compiler warnings and error messages from users so as to not upset them, are helpful to novice programmers. So all a matter of taste, I suppose. I myself actually program Arduinos without using the IDE, so I can stay in standard C++, and avoid all the non-standard Arduinoisms.

As to the question of learning C or C++ first, I'd recommend learning C first. It's a smaller, simpler and cleaner language, and in many ways more coherent than C++, which is (relatively) vast, complex and untidy. Once you've mastered C, it's a matter of learning C++ incrementally as a series of extensions the basic core of the C language. Almost all of C is necessary to program effectively, much of C++ is not.

In my opinion, the first and last book you'll need for learning C is "The C Programming Language" by Kernighan and Ritchie. Like the C language itself, the text is small, simple and clean. A classic. :slight_smile:

Just a note:

there are enough differences that mean the syntax and semantics depart from standard C++

definitely not, IMHO. A "non-stadard" syntax sketch would certainly not compile. As for the semantics, the Reference section documents the included libraries, while for everything else one can search "normal" (i.e. non-Arduino specific) online c++ documentation.

Well, C and C++ require either pre-declaration of functions or function prototypes, so any forward references would fail in a straightforward C/C++ environment.