Перейти к содержанию
    

MicroLIB не поддерживает C++. И что?

7 minutes ago, Arlleex said:

Ну так ли это сейчас влияет на retarget с его сраным полухостингом... Вряд ли, ИМХО.

Вот к чему я все это начал:

4.jpg.e0a6c84714e52f85568441b5bdf1d718.jpg

Не оно?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего, оно. Только вот на что оно влияет в плане исходников - хрен поймешь.
Сделал даже как вот тут описано - один фиг не работает, под отладчиком зациклилось в _sys_exit().

В аду отдельный котел для тех, кто сие изобрел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, а покажите этот самый startup и заодно остальные исходники из этого пустого проекта

У меня стартап на плюсах, штатный отключен и все прекрасно работает. Так что ситуация честно говоря странная.

Может, проблема с неправильным размером кучи? Она должна быть хотя бы 16 байт если не ошибаюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, Forger сказал:

Может, проблема с неправильным размером кучи? Она должна быть хотя бы 16 байт если не ошибаюсь.

Только что, шагая под отладчиком, выяснил, что некая __argv_alloc, видимо, пользуется кучей.
image.png.b8cd679b11246dd4fe3b0247b02c5f7c.png

А она у меня в стартапе 0 задана (не думал я, что штатная библиотека инициализации окружения использует кучу).

Поправил на 256 (ради эксперимента) и все заработало. Потом прочел Ваше сообщение. Спасибо, действительно куча должна быть не 0.
Меньше 256 байт (но кратно степени двойки), т.е. 128, 64, 32, 16... не хватает, видимо - также __argv_alloc() возвращает 0 и вызывается _sys_exit().

Однако в проекте надо переопределить некоторые функции и вписать в любом исходнике __asm(".global __use_no_semihosting"). Я завел retrg.c

Скрытый текст

#include <time.h>
#include <rt_sys.h>
#include <rt_misc.h>


__asm(".global __use_no_semihosting");


const char __stdin_name[]  = ":tt";
const char __stdout_name[] = ":tt";
const char __stderr_name[] = ":tt";


FILEHANDLE _sys_open(const char *name, int openmode)
{
  return 1;
}

int _sys_close(FILEHANDLE fh)
{
  return 0;
}

char *_sys_command_string(char *cmd, int len)
{
  return NULL;
}

int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
{
  return 0;
}

int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned len, int mode)
{
  return -1;
}

void _ttywrch(int ch)
{
}

int _sys_istty(FILEHANDLE fh)
{
  return 0;
}

int _sys_seek(FILEHANDLE fh, long pos)
{
  return -1;
}

long _sys_flen(FILEHANDLE fh)
{
  return -1;
}

void _sys_exit(int return_code)
{
  while(1);
}

clock_t clock(void)
{
  return 0;
}

void _clock_init(void)
{
}

time_t time(time_t *timer)
{
  return 0;
}

int system(const char *string)
{
  return 0;
}

char *getenv(const char *name)
{
  return NULL;
}

void _getenv_init(void)
{
}

 

31 минуту назад, ViKo сказал:

Откажитесь от своего asm стартапа.

Не вижу прямой связи и разницы, в чем он написан, для конкретно моего случая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У себя в стартапе прописал это:

__asm(".global __use_realtime_heap \n\t");
__asm(".global __ARM_use_no_argv \n\t");
__asm(".global __use_two_region_memory \n\t");

Особенно обратите внимание на это: 

__asm(".global __ARM_use_no_argv \n\t");
23 minutes ago, Arlleex said:

__asm(".global __use_no_semihosting")

У меня сразу ругается линкер:

Error: L6915E: Library reports error: __use_no_semihosting was requested, but _sys_exit was referenced
Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О как, спасибо. А почему у Вас __asm(".global __use_realtime_heap") есть? Стандартной кучей пользуетесь?

Глянул Reference Guide на ARM Compiler 6.15 - что-то про __ARM_use_no_argv ничего внятного не нашлось...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Forger сказал:

У меня сразу ругается линкер...

Да, логично, потому что нужно подсунуть свои определения для _sys_command_string(), _ttywrch() и _sys_exit().

1 минуту назад, Forger сказал:

У меня автоматом подключился...

А, ну вот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, Arlleex said:

Стандартной кучей пользуетесь?

Да, но ее RTX использует, в целом мне так даже удобнее получается. Не помню, почему отказался от статического выделения стеков и TCB для задач, но так тоже прекрасно работает.

Да и куча используется только на старте приложения, поэтому дефрагментация и тп. ей не грозят в принципе.

 

Just now, Arlleex said:

Да, логично, потому что нужно подсунуть свои определения для _sys_command_string(), _ttywrch() и _sys_exit().

А, ну вот.

Они используются EventRecorder, не хочу ломать логику, создавая грабли на новом месте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Forger сказал:

Да и куча используется только на старте приложения, поэтому дефрагментация и тп. ей не грозят в принципе.

Мне сейчас главное понять, в каком месте моего изучения C++ вылезет неявное выделение динамической памяти, дабы знать, где делать этого не следует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, Arlleex said:

Мне сейчас главное понять, в каком месте моего изучения C++ вылезет неявное выделение динамической памяти, дабы знать, где делать этого не следует.

Не использовать stl шаблоны с использованием кучи, ну и явно не использовать ее саму )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже разобрался. В ARM Compiler 6 Reference Guide версии 6.13 вполне четко описано, что делать, чтобы отключить полухостинг. Про __ARM_use_no_argv там тоже в этом контексте вполне понятно написано. Не ясно, зачем они это описание исключили из всех последующих версий, оставив ровно такую же функциональность. Сейчас все работает как нужно, без MicroLIB, с размером кучи, равным 0. Достаточно, на самом деле, где-нибудь в исходниках включить определение двух глобальных символов

__asm(".global __ARM_use_no_argv");
__asm(".global __use_no_semihosting");

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...