El nuevo operador de C ++ se basa en la asignación de memoria dinámica, por ejemplo, a través de malloc (también son posibles implementaciones alternativas que usan sbrk directamente). La biblioteca estándar de C integra una implementación de malloc, pero no sabe qué memoria usar. La biblioteca C estándar usa la función sbrk para adquirir algo de memoria del sistema subyacente. En un entorno alojado, el sistema operativo proporciona esta función. Pero en un entorno independiente, usted debe definir esta función. Después de todo, usted es el único que sabe cuál debe ser el diseño de la memoria.
Dependiendo de la biblioteca de C estándar que use, hay diferentes opciones. Supongo que estás usando newlib (muy popular para los sistemas integrados). En este caso, podría proporcionar una implementación malloc alternativa en lugar de proporcionar la función sbrk y usar la implementación de newlib. El siguiente código debería funcionar más o menos. Esto proporciona la versión reentrante de malloc. Desde lo alto de mi cabeza, no estoy seguro de cómo debe verse la definición de función no reentrante o sbrk.
#define HEAP_SIZE 512
uint8_t heap[HEAP_SIZE];
size_t heap_idx = 0;
// Not sure what this has to be called. Try some of the following:
// void * sbrk(int size) {
// void * _sbrk(int size) {
void * _malloc_r(struct _reent * re, size_t size) {
void * ret = NULL;
if (heap_idx + size < HEAP_SIZE)
{
ret = &heap[heap_idx];
heap_idx += size;
}
return ret;
}
También hay un código de ejemplo en el manual de newlib que utiliza toda la RAM que no se usa estáticamente como montón. También hay otros syscalls (salir, cerrar, leer ...) que pueden ser útiles para implementar. Consulte el capítulo 12 'syscalls' en el manual de newlib . Eso también debería ocuparse de los otros símbolos indefinidos. Si no puede proporcionar estos syscalls (por ejemplo, no tiene un sistema de archivos), no puede usar ciertas funciones. Por ejemplo, fopen necesita algunos syscalls como abrir, cerrar, fstat ...
Para un sistema completamente funcional, es probable que también desee proporcionar implementaciones de forma gratuita, calloc y realloc. También tengo que agregar la advertencia de repetición: la asignación dinámica en sistemas integrados es increíblemente peligrosa. Si no sabe exactamente lo que está haciendo, probablemente debería atenerse a las asignaciones estáticas. Eso también es posible con C ++. Por ejemplo, podría crear una instancia de su clase como esta:
CGPIO pGPIO();
En este caso, el objeto se asigna en la pila y se destruirá tan pronto como la variable salga de su alcance. Pequeño bono: si no usa nuevo, probablemente no tenga que agregar una implementación sbrk o malloc.