Jump to content

    

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

2 minutes ago, ViKo said:

А целиком можете выложить?

Вы не пробовали подобные вопросу гуглу задавать?

Share this post


Link to post
Share on other sites
19 минут назад, Орлёнок сказал:

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

Там 0xFF. Конечно. Деваться некуда, перебирает, пока не переполнится.

Только что, esaulenka сказал:

Вы не пробовали подобные вопросу гуглу задавать?

"Смените пластинку", у вас заело.

Share this post


Link to post
Share on other sites

Спасибо! Есть что почитать. :prankster2:

Share this post


Link to post
Share on other sites
1 час назад, ViKo сказал:

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

В нормально построенной программе на Cortex-M процессор никуда не "топает до конца". Потому, что есть MPU и грамотные люди разрешают выполнение кода только для тех регионов памяти, где расположен код. Так что "топать" будет только до конца текущего региона кода, а потом попадёт в обработчик fault-ов.

Если конечно MPU имеется на борту....

Share this post


Link to post
Share on other sites
1 час назад, ViKo сказал:

Там 0xFF. Конечно. Деваться некуда, перебирает

32-битное линейное адресное пространство занимает 4 Гига. После флеша там есть дыра, попытка чтения из которой вызывает исключение.

Share this post


Link to post
Share on other sites

Так, понятно, на ассемблере писалось не для Cortex. А для 8051, PIC16.

Share this post


Link to post
Share on other sites

По сути main - это вырожденная фишка программ под DOS или подобных антикварных оболочек.

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

Для МК этот main просто банальное наследие, атавизм. Освобождать ресурсы при выходе из main вряд ли кому-то когда-то понадобится.

Если же есть подобные потребности, то они решаются на уровне кода приложения.

 

Куда логичнее вместо main сразу запускать, скажем, ось.

 

Или сделать как в "старой доброй" ардуине: вызывается setup(), а следом в цикле loop(), выйти из которого не получится, поскольку бесконечный цикл находится снаружи этой loop().

Для конечного кодера этого более чем достаточно.

 

К слову, у меня main вот так выглядит:

int main()
{
	static InternalControlPanel internalControlPanel;
	internalControlPanel.initialize();
	internalControlPanel.run();
  
  // never reach here!
}

 

Share this post


Link to post
Share on other sites
4 hours ago, ViKo said:

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

RTOS или не RTOS - вот в чем вопрос.

То ли в  mbed то ли в zephyr так вообще предопределили IAR-овский __main и в С-ишный main  даже не заходят. 
  

Share this post


Link to post
Share on other sites

Вопрос задал человек, с RTOS не знакомый. Пишет на ассемблере, а как на C - не знаю. PIC18.

Но мне уже самому стало интересно.

Share this post


Link to post
Share on other sites
17 minutes ago, ViKo said:

человек, с RTOS не знакомый. Пишет на ассемблере, а как на C - не знаю. PIC18

Уникальный случай :biggrin:

 

 

Share this post


Link to post
Share on other sites
29 минут назад, Forger сказал:

Уникальный случай :biggrin:

 

 

Рутина. Потребовалось поправить давно написанное, хвать, ан работника и нету. Ушел на лучшее место, и правильно сделал. Приходится править тому, кто есть (нач. отд. собственно, он же и гл. констр. по теме, 70+ лет).

Share this post


Link to post
Share on other sites
56 minutes ago, ViKo said:

Вопрос задал человек, с RTOS не знакомый. Пишет на ассемблере, а как на C - не знаю. PIC18.

Но мне уже самому стало интересно.

Пробегал мимо меня тут какой-то проект минского старого разработчика, уволившегося,  на двух PIC-ах, на ассемблере, управлял неким электромагнитом. 
Не он случайно?  

Share this post


Link to post
Share on other sites

Не он. И не я. Уволился как раз молодой, начинающий. На C писал, но насколько качественно, я не оценивал. А теперь нужно править, как обычно. 

Share this post


Link to post
Share on other sites

А под отладчиком посмотреть?

Без понятия о системе команд пиков, но по идее возвращаемое значение должно попасть в какой-то регистр, а дальше что-то типа HALT.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now