Programming in C

So, the Arduino platform introduced me to the world of digital electronics - both in terms of hardware and software.

I've got a good grip on hardware now I believe, and am currently working on a somewhat complex design for a project. However - I plan to start programming in C or C++ now as opposed to the Arduino programming language, to actually develop a 'real-world' skill I can add to my portfolio.

I believe the Arduino language is a type of C++, so - what's the recommendation? Start writing C or C++? Seems logical to start at C, before ++?

I know the AVRs can be programmed in C, is it the 'GNU' IDE/compiler or something, or C can also be written straight into Atmel Studio? ...but can they also be programmed in C++?

Does anybody know of a link to an Arduino blink sketch for example, shown right next to a C program to do exactly the same function?

Many thanks in advance

jtw11:
I plan to start programming in C or C++ now as opposed to the Arduino programming language

There's no such thing as the "Arduino language." Arduino is programmed in C++.

Functions like digitalWrite() are just that, C++ functions.

Ah... I alays thought it was C++ but the functions such as digitalWrite were "Arduino added" functions.

Things like Serial.begin, are they also standard C++ functions?

I suppose my question is now somewhat different, I believe the Arduino IDE allows one to omit certain parts that initialise things from a program?

Well technically there are NO standard functions in C/C++. All functions need to be included.

The Arduino "library" adds functions like digitalWrite and Serial.begin.

Instead of the standard libc, avr-gcc compiles in avr-libc for many of the "standard" C-type functions.

I'm not trying to understate the Arduino functions. However, they aren't magic. Just look at the source code included with the IDE. (Java/hardware/arduino/cores/arduino). You can see how functions like digitalWrite() work.

Can we say Arduino is a combination of a hw platform + its own SDK ?

jtw11:
Ah... I alays thought it was C++ but the functions such as digitalWrite were "Arduino added" functions.

There are functions that come standard with the C and C++ programming languages, there are functions that come with 'standard libraries' supplied by compiler tool chain providers, and their are functions and libraries that Arduino includes with installation of the IDE and lastly there are any functions you yourself develop. Because a new function is developed and given to you for your use doesn't make the programming language being used not standard C++. Such functions are usually written in just standard C or C++ language.

Things like Serial.begin, are they also standard C++ functions?

No that 'standard' C++ functions. They are functions from libraries specifically developed for arduino that you can use or not use as you please. These functions are written in C++ and the source code for the functions are provided to you in the IDE distribution, if you wish to read them.

I suppose my question is now somewhat different, I believe the Arduino IDE allows one to omit certain parts that initialise things from a program?

Yes, there is an arduino pre-processor that supplies main() function and an initialization function that starts up timer0 interrupts to support the millis() and micros() functions. The pre-process also writes any needed function prototypes required for any functions you wrote in your sketch. I thinks that the limit of what it adds.
Lefty

Lefty, you (mis)use of quote tags is terrible :smiley: Just copy-n-paste the generated quote header over each paragraph, or use anon quote tags. Bold answers look a bit like SHOUTING to be...

tuxduino:
Can we say Arduino is a combination of a hw platform + its own SDK ?

I think this is the most appropriate description.

tuxduino:
Lefty, you (mis)use of quote tags is terrible :smiley: Just copy-n-paste the generated quote header over each paragraph, or use anon quote tags. Bold answers look a bit like SHOUTING to be...

With over 12k posts, you haven't noticed that's how he responds?

I shouldn't worry - I don't feel shouted at.

In the cores > arduino folder, which is the file that includes the source code for the functions such as digitalWrite?

Just downloading Notepad++ now to make things like this a little easier.

If something is wrong, repeating it 12k times doesn't make it right. Anyway that's the first and last time I'm going to complain about it. Tonight I just failed to keep myself from ot-posting... sorry :stuck_out_tongue:

jtw11:
I shouldn't worry - I don't feel shouted at.

In the cores > arduino folder, which is the file that includes the source code for the functions such as digitalWrite?

Just downloading Notepad++ now to make things like this a little easier.

Take a look at the files you find here:

arduino-1.0.2/hardware/arduino/cores/arduino

(arduino-1.0.2 is the folder where I uncompressed the archive).

tuxduino:
Lefty, you (mis)use of quote tags is terrible :smiley: Just copy-n-paste the generated quote header over each paragraph, or use anon quote tags. Bold answers look a bit like SHOUTING to be...

I consider it a style choice. Bolding is just to clearly separate the OP questions from my responses. It works much faster then copy and pasting for me. I usually limit it to postings that have many questions embedded in a single posting and often use the format you suggest for short questions. So there you go, and I'm not even shouting about it. :smiley:

Lefty

So, back on track...

So, C++ is essentially an incredibly 'customisable' language for lack of a better expression, with functions included as either custom or standard libraries?

Please explain this statement a little more? I don't follow.

jtw11:

[quote author=James C4S link=topic=133761.msg1006433#msg1006433 date=1353626978]
Well technically there are NO standard functions in C/C++. All functions need to be.

So, C++ is essentially an incredibly 'customisable' language for lack of a better expression, with functions included as either custom or standard libraries?[/quote]
Yes, exactly. On many systems these "standard" libraries are known as "libc". These include things like math functions, printf(), etc.

Please explain this statement a little more? I don't follow.
[/quote]
libc exists for PC-operating systems. avr-libc exists for AVR processors like the ATmega328. That's why the same math functions that work on your PC work on your Arduino. There is a library specific for the platform (well processor).

@lefty :slight_smile:

@op: the issue is not limited to C/C++. You always have language + standard libraries. They provide (at least) the absolute minimum to manipulate data (think str* family for C-strings), interact with the OS and the user, ecc. Java is an example where the standard libraries can be considered part of the language. C++ instead is more towards the "naked language" end of the scale.

So an Arduino board is programmed in C++, but the SDK includes a set of functions that make it very easy (compared to non-arduino specific software development environments) to perform certain common operations, like driving a digital pin, reading an analog value, communicating via a serial interface and so on.
Those functions create what is called an abstraction layer, that is code that hides the gory details of how certain subsystems work or certain hw functionality is exploited, so that you don't think anymore in terms of bit n of PORTx, but just refer to Arduino pin 1.

Does anybody know of a link to an Arduino blink sketch for example, shown right next to a C program to do exactly the same function?

They are very similar. A "standard" C version would be something like this:

#include <avr/io.h>

void setup(void) {
//reset your chip here
}

void loop(void) {
//put your code here
}

int main(void) {
  setup();
  while (1) {
    loop();
  }
}
[/quote]

All the arduino ide does is to put your setup() and loop() into a canned main() and compile - you can check the temporary folder to see the recombined code.

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.

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: