waffleman
waffleman

Reputation: 4349

To write a bootloader in C or C++?

I am writing a program, more specifically a bootloader, for an embedded system. I am going to use a C library to interact with some of the hardware components and I have the choice of writing it either in C or C++. Is there any reason I should choose one over the other? I do not need the object oriented features of C++ but it does have a stronger type system. Could it have other language features that would make the program more robust? I know some people avoid C++ because it can (but not always) generate large firmware images.

Upvotes: 18

Views: 8778

Answers (9)

eyalm
eyalm

Reputation: 3366

Use C with µClibc. It will make your code simpler and reduce its footprint. Can be found in: www.uclibc.org.

Upvotes: 0

spoulson
spoulson

Reputation: 21601

Go with C++ and objchoose what language features you need. You still have full control of the output object code as long as you understand the C++ abstractions that you're using.

Use of OO can still run well if you avoid the use of virtual functions. Avoid immutable object types that require a lot of copying in order to pass values, like std::string. But, you can still use features like templates without any real impact on runtime performance.

Upvotes: 2

semaj
semaj

Reputation: 1575

Most of the previous answers assume that your bootloader is small and simple which is typically the case; however, if it becomes more complex (i.e. you need to be able to load from an Ethernet port, a USB port, or a serial port...you need to validate the code that is being loaded before you wipe out your existing code, etc.) you may want to consider C++.

I have also found that the bootloader and the application typically share some amount of common code so you may also want to consider using the same language as your application to facilitate the code sharing.

Upvotes: 4

Gerhard
Gerhard

Reputation: 7069

I would use C unless there is a specific reason to use C++. For a Bootloader you are not really going to need OO.

Use the simplest tool that will accomplish the job.

Upvotes: 9

Kyle Rosendo
Kyle Rosendo

Reputation: 25287

If you don't need to use Object Orientation, use C. Simple choice there. Its simpler and easier, whilst accomplishing the same task.

Some die hards will disagree, but OO is what makes C++ > C, and vice versa in a lot of circumstances.

Upvotes: 10

DrAl
DrAl

Reputation: 72726

This isn't a particularly straightforward question to answer. It depends on a number of factors including:

  • How you prefer to layout your code.
  • Whether there's a C++ compiler available for your target (and any other targets you may wish to use the bootloader on).
  • How critical the code size is for your application (we're talking about 10% extra maybe, not MB as suggested by another answer).

Personally, I really like classes as a way of laying out my code. Even when writing C code, I'll tend to keep everything in modular files with file-scope static functions "simulating" member functions and (a few) file-scope static variables to "simulate" member variables. Having said that, most of my existing embedded projects (all of which are relatively small scale, up to a maximum of 128kB flash including bootloader, but usually less) have tended to be written in C. Now that I have a C++ compiler though, I'm certainly considering moving to C++.

There are considerable benefits to C++ from simply using references, overloading and templates, even if you don't go as far as classes. Certainly, I'd stop short of using a lot of more advanced features, including the use of dynamic memory allocation (new). Then again, I'd avoid dynamic memory allocation (malloc etc) in embedded C as well if possible.

If you have a C++ compiler (even if it's only g++), it is worth running your code through it just for the additional type checking so that you can reduce the number of problems in your code. The C++ compiler can pick up on a few things that even static analysis tools won't spot.

For a good discussion on many invalid reasons people reject C++, see Dan Saks' article on Embedded.com.

Upvotes: 29

Artelius
Artelius

Reputation: 49134

The C language is substantially easier to parse than C++. This means a program that is both valid C and valid C++ will compile faster as a C program. Probably not a major concern, but it is just another reason why C++ is probably overkill.

Upvotes: 2

Matt Joiner
Matt Joiner

Reputation: 118710

For a boot-loader the obvious choice is C, especially on an embedded system. The generated code will need to be close to the metal, and very easy to debug, likely by dropping into assembly, which quickly becomes difficult without care in C++. Also C tool-chains are far more ubiquitous than C++ tool-chains, allowing your boot-loader to be used on more platforms. Lastly, generated binaries are typically smaller, and use less memory when written C style.

Upvotes: 11

Kirill V. Lyadvinsky
Kirill V. Lyadvinsky

Reputation: 99715

Write programs in C is not the same as writing it in C++. If you know how to do it only in C++, then your choice is C++. For writing bootloader it will be better to minimize code, so you probably will have to disable standard C++ library. If you know how to write in C then you should use C — it is more common choice for such kind of tasks.

Upvotes: 7

Related Questions