I am using uVision 4.21 MDK_ARM to learn how to program C++ on MCB1700.
I have create a new project and add 2 files (startup_CPL17xx.s / system_LPCxx.c) to startup group. Then I add main.cpp to Sources Files group. The project options are:
Device: LPC 1768 Target: Default Output: Default Listing: Default User: Default C++: Default Asm: Default Linker: Default Debug: Use ULINK Cortex Debugger Utilities: Default
Then I change the startup_LPC17xx.s Stack Size: 0x0000 1000 Heap Size: 0x0000 1000
My main.cpp code:
#include <vector> #include <string> int main (void) { int i = 0; int sum = 0; std::vector<int> vInt; std::string str = "Hello, C++"; vInt.push_back(1); vInt.push_back(2); vInt.push_back(3); vInt.push_back(4); vInt.push_back(5); sum = vInt.size(); sum = 0; for(i=0; i<5; i++) { sum += vInt[i]; } while(1); //return 0; }
I build the project successfully and download it to MCB1700 board "OK". Then I hit "F9" to set break point at line "vInt.push_back(1);". After I select Debug->Start Debug Session, the break point is not reached even I hit "F5" many times. Why?
By the way, I find there are 2 windows: Disassembly Window and Code Window (for main.cpp). How could I step through the code on C++ source code level and how could I step through the code on Assembly level?
Hi David,
Regarding your stack/heap question - you already sum it up pretty well. Broadly speaking, there are three ways your program will use RAM: global and static variables in the data segments, automatic (local) variables on the stack and dynamically allocated memory on the heap.
It's really hard to come up with recommendations for the stack size since it depends almost entirely on the depth of your call tree. If you don't have recursively called functions you can monitor your stack usage by pre-initializing it with a constant value and checking how much gets consumed. It's hard to analyze stack usage from your code alone since the optimizer will make many variables disappear.
The heap usage is under your control, for the most part. Whenever you use malloc or new the heap is used so you know how much gets consumed. Libraries will also use the heap but you can usually figure out who uses how much.
All this get's much more complex with C++, especially if you use RTTI and exceptions. You'd be well advised to study what other embedded experts have to say about using C++ in embedded systems. Embedded.com has a lot of information on that topic, e.g. here: www.eetimes.com/.../Embedding-C-or-C--Is-that-really-the-question-
Andrew