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

Как это делается средствами Си или IAR C

переход в эту точку происходит путем вызова функции longjmp().

А я о чем? Только о том, что прямо установить точку возврата невозможно.

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


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

В бутлоадере исплользовал такое объявление функции:

void (*start_application)( void ) = 0x0000;     //pointer to application
                                                //at flash start

Далее, в произвольном месте программы, мы можем ее вызвать и соответственно перейти по адресу 0.

З.Ы. Работает. Использую компилятор GCC.

 

Спасибо. Не додумался до такого. Прямолинейно мыслю, - переход значит переход! :)

 

А в IAR, интересно, это выглядит так?

 

extern void start_application(void)@0x0000;

 

Спасибо также _bill. Не обратил внимания, теперь буду помнить. Думаю можно использовать по входу/выходу из sleep.

 

Всем остальным тоже спасибо. Буду переваривать и пробовать.

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


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

А в IAR, интересно, это выглядит так?

 

extern void start_application(void)@0x0000;

 

Процитирую коллегу:

 

RAM зачем расходовать попусту? Сразу и пишите.

(void (*)(void))(0x0000)();

 

Это наиболее правильный вариант.

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


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

Процитирую коллегу:

 

RAM зачем расходовать попусту? Сразу и пишите.

(void (*)(void))(0x0000)();

 

Это наиболее правильный вариант.

 

Сейчас глянул на цитируемое и понял, что в первом посте банально опечатался :( и для полгого счастья скобочек не хватает. Во втором посте не ошибся, полностью универсально и переносимо так:

((void (*)(void))(0x0000))();

 

1. Берем абстрактный 0

2.....делаем из него указатель (*)0

3. ... на функцию ((*)())0

4. ... без аргументов ((*)(void))0

5.... ничего не возвращающую (void(*)(void))0

6.... если вместо 0 какой-нибудь define выражение поставлять будут и забудут в выражении скобочки поставить,то для перестраховки ставим свои (void(*)(void))(0)

7. осталось вызвать функцию ((void(*)(void))(0))();

8. Это я все к тому, что на форуме уже был спор по подобному прводу со стенаниями "непонятно!!!","скобочки!!!", "звездочки!!!". Решил пошагово обьяснить.

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


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

8. Это я все к тому, что на форуме уже был спор по подобному прводу со стенаниями "непонятно!!!","скобочки!!!", "звездочки!!!". Решил пошагово обьяснить.

Стенают обычно те, кто вырос на Паскале.

У эмбеддеров такие вопросы не возникают.

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


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

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

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

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

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

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

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

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

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

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