Coincidentally, I ported the Marlin firmware to build independent of the Arduino build system before they officially supported it. It’s not too hard. Arduino’s libraires are nice, but I’ve always hated its IDE and convoluted build system. If you’re on Windows, Atmel Studio is the way to go for AVR development. In the past few years Atmel Studio did add support for compiling Arduino projects directly, but then that just emulates the same wacky build system. Once more thought on the original code having issues. That code is using operator new[ ] on Arduino. That is often not defined on embedded platforms. It’s been a little while since I was in Arduino/AVR land, but I think it may be excluded by default to save space. Its not hard to add your own definition. It may be giving off that error for that reason. You could try commenting out the original code and try something like: Int* foo = new int[42]; And see if that compiles and links ok. If not, you need to add 4 operators: operator new, operator new[], operator delete, operator delete[] the operator new and operator new[] can just be wrappers for malloc void* operator new[](size_t size) { return malloc(size); } And operator delete and delete[] can be just wrappers for free: void operator delete(void* p) { free(p); } (note one little shortcut, you never need to do a null-check on “free” because the C library spec says calling free with a null pointer is a no-op. delete nullptr in C++ is also in its spec as a no-op. ) All that being said, you really want to avoid dynamic memory on most AVR chips if you can, with 8 or 16k total sram there is not much margin and it wouldn’t take much to fragment the memory to where allocations will fail. Also always use delete[] ptr;, if ptr was allocated with new[]. In many cases the behavior is identical, but for classes with destructors, calling delete[] ensures that the destructor for each object in the array is called. From: Robert Mackie Or just build a file to so that you are building under gcc/g++ and not arduino. If you are looking for an example of how to do that, I just recently noticed that Marlin (the firmware for a lot 3d printers including reprap) has an example of how to do it. You can still build edit and build from the arduino IDE but the build system doesn't play all the games, as far as I can tell. (it adds special file that does something to make that work) At least something like that is going on. It has a Marlin.ino file that does NOT have the void setup() and void loop() functions. Rather it has some #ifdef's and some #include's then there is a file named "Marlin_main.cpp" that has the "void loop()" and the "void setup()" and some other stuff in it. I don't see a lot of template work, but g++ is g++ with respect to templates. Whatever they are doing works some magic with how the files are organized so that it can be more like a normal code layout, again - I *think*. There are many git repos out there with variations of the Marlin source tree if you want to look at it. google or github can find them. Here's a comment I found in the Marlin.ino file /* All the implementation is done in *.cpp files to get better compatibility with avr-gcc without the Arduino IDE */ /* Use this file to help the Arduino IDE find which Arduino libraries are needed and to keep documentation on GCode */ No, I don't know what I'm talking about with the Arduino IDE. I just keep faking it to success. Rob. Rob. On Tue, Apr 21, 2020 at 5:43 PM Jon Wolfe via TriEmbed <[email protected]> wrote:
|
_______________________________________________ Triangle, NC Embedded Computing mailing list
To post message: [email protected] List info: http://mail.triembed.org/mailman/listinfo/triembed_triembed.org TriEmbed web site: http://TriEmbed.org To unsubscribe, click link and send a blank message: mailto:[email protected]?subject=unsubscribe
