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

Куда в микроконтроллере возвращается функция Main?

Коллега задал вопрос, на который я однозначно ответить не смог. Если в Main нет бесконечного цикла, то при выходе куда попадет? Еще и код возврата передаёт же. Его и проверить можно, или как? 

Сам сейчас не имею времени для изучения. Потом попробую. Или кто точно ответит. 

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


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

Интересно. 

Там в примере код возврата EXIT_SUCCESS.  Где анализируется? 

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


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

А кто его знает? :)

В гуглях наверняка есть, это же стандартные сишные дела, которые встроены в любую библиотеку, поставляемую компилятором к любому камню.

Они наверняка существуют чуть ли не античных времен, когда был создан С ))

 

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


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

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

что  я встречал это while(1)

Вы не оригинальны. Вопрос к тем, кто копает глубже. 

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


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

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

Вопрос к тем, кто копает глубже. 

Вопрос: а зачем?

Логично было бы наоборот - выпилить все эти функции из финальной прошивки, все равно никогда не вызываются ))

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


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

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

Итак, "есть ли жизнь после Main"?

https://ru.cppreference.com/w/cpp/language/main_function

https://ru.cppreference.com/w/cpp/utility/program/exit

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


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

14 minutes ago, ViKo said:

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

Итак, "есть ли жизнь после Main"?

Ничего не понятно - зачем вообще выпускать из main? Более того практически везде стоят оси и поэтому такое поведение кода попросту невозможно :mda:

В противном случае вопрос получается риторический, ответ на такой вряд ли удасться найти )

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


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

void Reset_Handler(void)
{
	unsigned long *pulSrc, *pulDest;

	enable_fpu();

	// Инициализация стека
	for(pulDest = &_susrstack; pulDest < &_estack;) *(pulDest++) = 0xCCCCCCCC;

	// Инициализация данных в секции .data
	pulSrc = &_sidata;
	for(pulDest = &_sdata; pulDest < &_edata;) *(pulDest++) = *(pulSrc++);

	// Обнуление данных в секции .bss
	for(pulDest = &_sbss; pulDest < &_ebss;) *(pulDest++) = 0;

	// Вызов функции main
	main();
}

У меня такой стартап. При выходе из main() вернемся в Reset_Handler.

Попытка выйти из Reset_Handler приведет к краху стека.

Можно или так сделать:

void Reset_Handler(void)
{
	. . .
	// Вызов функции main
	main();
  	while(1);
}

или так:

void Reset_Handler(void)
{
	. . .
	// Вызов функции main
	while(1) main();
}
void Reset_Handler(void)
{
	. . .
  	// Вызов функции main
	main();
  	while(1) NVIC_SystemReset();
}

Но выход из main() в МК не имеет смысла.

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


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

Помню, на ассемблере, как закончится программа, так процессор дальше топает по пустой памяти до конца. Потом с нуля начинает новую жизнь.

Надо думать, на C такого не будет? Нечто удержит программный счетчик в рамках, или остановит его.

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


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

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

так процессор дальше топает по пустой памяти до конца

Даже если там нет валидных опкодов?

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


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

Цитата

System termination
This illustration shows the different ways an embedded application can terminate in a
controlled way:

image.png.e2a4a491a563449b5bd63c9fa52e363d.png

An application can terminate normally in two different ways:
● Return from the main function
● Call the exit function.
Because the C standard states that the two methods should be equivalent, the system
startup code calls the exit function if main returns. The parameter passed to the exit
function is the return value of main.
The default exit function is written in C. It calls a small assembler function _exit that
will:
● Call functions registered to be executed when the application ends. This includes
C++ destructors for static and global variables, and functions registered with the
standard function atexit. See also Setting up the atexit limit, page 106.
● Close all open files
● Call __exit
● When __exit is reached, stop the system.
An application can also exit by calling the abort or the _Exit function. The abort
function just calls __exit to halt the system, and does not perform any type of cleanup.
The _Exit function is equivalent to the abort function, except for the fact that _Exit
takes an argument for passing exit status information.

If you want your application to do anything extra at exit, for example resetting the
system (and if using atexit is not sufficient), you can write your own implementation
of the __exit(int) function.
The library files that you can override with your own versions are located in the
arm\src\lib directory. See Overriding library modules, page 122.

Это отрывок из IAR-овской доки EWARM_DevelopmentGuide.ENU.pdf.

 

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


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

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

Надо думать, на C такого не будет?

Чудес не бывает. Даже на сях. 

56 минут назад, adnega сказал:

При выходе из main() вернемся в Reset_Handler.

Попытка выйти из Reset_Handler приведет к краху стека.

В общем случае reset_handler вызывает cstartup, cstartup делает инициализацию и вызывает main(), после вызова main() в cstartup обычно стоит пустой цикл.

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


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

17 минут назад, SSerge сказал:

Это отрывок из IAR-овской доки EWARM_DevelopmentGuide.ENU.pdf.

Хорошая дока. А целиком можете выложить?

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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