реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> CortexM3, запись данных в Program Counter.
Danis
сообщение Nov 28 2011, 11:09
Сообщение #1


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Привет, коллеги по цеху!

Работаю в IAR, пишу на Си. Имеется надобность прочитать данные из ячейки flash по адресу 0x08000804 и записать их в регистр PC (R15). Походу тут без ассемблера не обойтись. Прошу помощи в реализации кода. Спасибо!


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 28 2011, 11:25
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А указатель на функцию не то?

Go to the top of the page
 
+Quote Post
Danis
сообщение Nov 28 2011, 11:36
Сообщение #3


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(ViKo @ Nov 28 2011, 14:25) *
А указатель на функцию не то?


Думаю нет.


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
Flexz
сообщение Nov 28 2011, 11:54
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Вам нужно сделать переход по адресу без модификации стека?
Если же на стек наплевать, то лучше сделать именно через указатель на фукнцию.
Go to the top of the page
 
+Quote Post
Danis
сообщение Nov 28 2011, 13:56
Сообщение #5


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(Flexz @ Nov 28 2011, 15:54) *
Вам нужно сделать переход по адресу без модификации стека?
Если же на стек наплевать, то лучше сделать именно через указатель на фукнцию.


Немного конкретизирую. У меня в микроконтроллере два проекта.
Первый – загрузчик, располагается на последних страницах flash.
Второй – обновляемая программа (рабочая), расположена выше загрузчика.
После старта контроллера, программа попадает сразу в загрузчик. Последний проверяет, если нет подключения к ПК по USB, то нужно перепрыгнуть наверх, где расположена рабочая программа.
Для этого мне нужно как минимум инициализировать регистр вершины стека и записать значение перехода в программный счетчик.
Под отладкой, вручную забивал эти регистры – все работает на ”ура”.


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
borman11
сообщение Nov 28 2011, 18:56
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 16-03-06
Из: Москва
Пользователь №: 15 298



Вот пример из бутлоадера Flash Magic
Код
void execute_user_code(void)
{
    void (*user_code_entry)(void);
    user_code_entry = (void(*)(void)) USER_FLASH_START;
    user_code_entry();
}
Go to the top of the page
 
+Quote Post
Danis
сообщение Nov 29 2011, 06:42
Сообщение #7


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(borman11 @ Nov 28 2011, 21:56) *
Вот пример из бутлоадера 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?


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 29 2011, 07:43
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Danis @ Nov 29 2011, 09:42) *
Но мы тут просто "тупо” перепрыгнули адрес (Инструкция BLX).

"Тупо перепрыгнуть" была бы команда B, а здесь Branch with link and change state.
Вы занесли адрес возврата в LR. А стек при чем? Разве он чем-то забит?
Go to the top of the page
 
+Quote Post
Danis
сообщение Nov 29 2011, 09:05
Сообщение #9


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(ViKo @ Nov 29 2011, 10:43) *
А стек при чем? Разве он чем-то забит?


Я ведь с одного проекта на другой перепрыгиваю. Разве можно оставить без инициализации SP?


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 29 2011, 09:14
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Danis @ Nov 29 2011, 12:05) *
Я ведь с одного проекта на другой перепрыгиваю. Разве можно оставить без инициализации SP?

Так он же останется прежним. Если стек очищен, значит, указатель будет указывать на начало стека.
Go to the top of the page
 
+Quote Post
shreck
сообщение Nov 29 2011, 09:15
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



У меня загрузчик прыгает на основное приложение так (основа - примеры от 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();
    }
}
Go to the top of the page
 
+Quote Post
Danis
сообщение Nov 29 2011, 09:29
Сообщение #12


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(shreck @ Nov 29 2011, 13:15) *
У меня загрузчик прыгает на основное приложение так (основа - примеры от 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 большое спасибо. Выручили!


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 29 2011, 17:59
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



подниму вопрос по стеку еще раз, теперь для NXP, у которых нет __set_MSP()
итак, есть бут, есть пара вещей в оперативке и во флеше, которая должна остаться для приложения
ему (приложению) оставляются ссылки на все это дело

Из приложения вся инициализация пока убрана. Оно будет работать в своей области адресов, но может вызывать некоторые функции бута и обращаться к переменным (все адреса - в той таблице, приложение адрес таблицы знает)

Скажите, что так или не так

1. Вектора прерываний. Бут инициализирует таблицу в RAM. Приложение, если нужно, поменяет на свои
2. Тот же стек - в приложении активно пользоваться не будет (не выйдет за пределы, обозначенные бутом). Стоит ли менять? Если да, то как? (просто прочитал ветку и задумался, может там есть какие-то камни подводные?)
3. Сишные либы. Ну тут долго жевали не так далеко на форуме, решили, что лучше те же самые либы оставить как буту - бутово, приложению - приложенево
4. ....... Возможно, по ходу возникнет

Спасибо
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 22:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01494 секунд с 7
ELECTRONIX ©2004-2016