Danis 0 28 ноября, 2011 Опубликовано 28 ноября, 2011 · Жалоба Привет, коллеги по цеху! Работаю в IAR, пишу на Си. Имеется надобность прочитать данные из ячейки flash по адресу 0x08000804 и записать их в регистр PC (R15). Походу тут без ассемблера не обойтись. Прошу помощи в реализации кода. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 ноября, 2011 Опубликовано 28 ноября, 2011 · Жалоба А указатель на функцию не то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Danis 0 28 ноября, 2011 Опубликовано 28 ноября, 2011 · Жалоба А указатель на функцию не то? Думаю нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 28 ноября, 2011 Опубликовано 28 ноября, 2011 · Жалоба Вам нужно сделать переход по адресу без модификации стека? Если же на стек наплевать, то лучше сделать именно через указатель на фукнцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Danis 0 28 ноября, 2011 Опубликовано 28 ноября, 2011 · Жалоба Вам нужно сделать переход по адресу без модификации стека? Если же на стек наплевать, то лучше сделать именно через указатель на фукнцию. Немного конкретизирую. У меня в микроконтроллере два проекта. Первый – загрузчик, располагается на последних страницах flash. Второй – обновляемая программа (рабочая), расположена выше загрузчика. После старта контроллера, программа попадает сразу в загрузчик. Последний проверяет, если нет подключения к ПК по USB, то нужно перепрыгнуть наверх, где расположена рабочая программа. Для этого мне нужно как минимум инициализировать регистр вершины стека и записать значение перехода в программный счетчик. Под отладкой, вручную забивал эти регистры – все работает на ”ура”. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
borman11 0 28 ноября, 2011 Опубликовано 28 ноября, 2011 · Жалоба Вот пример из бутлоадера Flash Magic void execute_user_code(void) { void (*user_code_entry)(void); user_code_entry = (void(*)(void)) USER_FLASH_START; user_code_entry(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Danis 0 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба Вот пример из бутлоадера Flash Magic ..... подправил под себя: unsigned int Data = *(u32*)(0x08000804); void (*user_code_entry)(void); user_code_entry = (void(*)(void))Data; user_code_entry(); Да, работает (”перепрыгивает”), спасибо. Но мы тут просто ”тупо” перепрыгнули адрес (Инструкция BLX). Но как быть с регистром R13(SP), полагаю, для правильной дальнейшей работы его тоже надо инициализировать значением из ячейки 0x08000800? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба Но мы тут просто "тупо” перепрыгнули адрес (Инструкция BLX). "Тупо перепрыгнуть" была бы команда B, а здесь Branch with link and change state. Вы занесли адрес возврата в LR. А стек при чем? Разве он чем-то забит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Danis 0 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба А стек при чем? Разве он чем-то забит? Я ведь с одного проекта на другой перепрыгиваю. Разве можно оставить без инициализации SP? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба Я ведь с одного проекта на другой перепрыгиваю. Разве можно оставить без инициализации SP? Так он же останется прежним. Если стек очищен, значит, указатель будет указывать на начало стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ashr 0 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба У меня загрузчик прыгает на основное приложение так (основа - примеры от ST): // Адрес начала основного приложения. #define APLICATION_ADDRESS 0x08003000 //------------------------------------------------------------------------------ // Запуск основного приложения, если оно зашито. Иначе возврат из функции. void run_app_if() { typedef void (*pFunction)(void); pFunction Jump_To_Application; uint32_t JumpAddress; if (((*(__IO uint32_t*)APLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) { // Jump to user application JumpAddress = *(__IO uint32_t*) (APLICATION_ADDRESS + 4); Jump_To_Application = (pFunction) JumpAddress; // Initialize user application's Stack Pointer __set_MSP(*(__IO uint32_t*) APLICATION_ADDRESS); Jump_To_Application(); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Danis 0 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба У меня загрузчик прыгает на основное приложение так (основа - примеры от ST): Вот так все ОК пулучилось! Код перехода из загрузчика в приложение (проверки на его наличие и целостность опущены): unsigned int Data = *(u32*)(0x08000804); void (*user_code_entry)(void); user_code_entry = (void(*)(void))Data; __set_MSP(*(__IO uint32_t*) 0x08000800); user_code_entry(); shreck, отлично! Спасибо за подсказки. ViKo, borman11, Flexz большое спасибо. Выручили! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба подниму вопрос по стеку еще раз, теперь для NXP, у которых нет __set_MSP() итак, есть бут, есть пара вещей в оперативке и во флеше, которая должна остаться для приложения ему (приложению) оставляются ссылки на все это дело Из приложения вся инициализация пока убрана. Оно будет работать в своей области адресов, но может вызывать некоторые функции бута и обращаться к переменным (все адреса - в той таблице, приложение адрес таблицы знает) Скажите, что так или не так 1. Вектора прерываний. Бут инициализирует таблицу в RAM. Приложение, если нужно, поменяет на свои 2. Тот же стек - в приложении активно пользоваться не будет (не выйдет за пределы, обозначенные бутом). Стоит ли менять? Если да, то как? (просто прочитал ветку и задумался, может там есть какие-то камни подводные?) 3. Сишные либы. Ну тут долго жевали не так далеко на форуме, решили, что лучше те же самые либы оставить как буту - бутово, приложению - приложенево 4. ....... Возможно, по ходу возникнет Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться