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

 
 
 
Closed TopicStart new topic
> как сместить программу на адрес 0x08002000
viakon
сообщение Sep 11 2012, 06:37
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Есть проект для STM32 под Eclipse. Пока в скрипте линкера stm32f100rb_flash.ld строка
FLASH (rx) : ORIGIN = 0x08000000

программа работает
стоит изменить на ORIGIN = 0x08002000
все престает работать. После загрузки проги в контроллер первый же шаг в отладчике выкидывает куда-то в середину тела проги. кроме этого приходится перезагружать openOCD.
До NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000); даже не доходит где-то раньше проблема возникает.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 11 2012, 06:42
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Даташит читали?
По адресу 8000000 должны лежать как минимум 8 байт - начальный адрес стека и начальный адрес программы.
Если вы хотите сместить программу, то эти 8 байт все равно должны быть. Кроме того, надо не забыть перенастроить смещение таблицы прерываний (VTOR по моему)
Go to the top of the page
 
+Quote Post
viakon
сообщение Sep 11 2012, 07:39
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Цитата(Непомнящий Евгений @ Sep 11 2012, 12:42) *
Даташит читали?
По адресу 8000000 должны лежать как минимум 8 байт - начальный адрес стека и начальный адрес программы.
Если вы хотите сместить программу, то эти 8 байт все равно должны быть. Кроме того, надо не забыть перенастроить смещение таблицы прерываний (VTOR по моему)


про стек можно поподробнее я только переход там положил
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 11 2012, 07:54
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



первые 4 байта - начальный адрес стека
вторые 4 байта - начальный адрес программы

Очень рекомендую PM0056 STM32F10xxx/20xxx/21xxx/L1xxxx Cortex-M3 programming manual
Go to the top of the page
 
+Quote Post
viakon
сообщение Sep 11 2012, 09:22
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



дело похоже вот в чем:
в окне консоли в Eclipse я вижу

Loading section .bload, size 0x34 lma 0x8000000
Loading section .isr_vector, size 0x1d0 lma 0x8002000
Loading section .text, size 0x10cf8 lma 0x80021d0
Loading section .bootprg, size 0x6c lma 0x8012ec8
Loading section .data, size 0x40 lma 0x8012f34
Loading section .string, size 0x94 lma 0x8012f74
Loading section .configuration, size 0x508 lma 0x801e000
Start address 0x800ad7c, load size 70980
Transfer rate: 24 KB/sec, 6452 bytes/write.
никаких сообщений об ошибках

а в консоли openOCD

Info : Padding image section 0 with 8140 bytes
Info : Padding image section 1 with 45048 bytes
Error: corrupted fifo read pointer 0x20000000

реально же грузится только секция .bload и все.

если секцию .bload поместить в общую кучу, то прога грузится нормально с 0x08002000 и работатет.
Go to the top of the page
 
+Quote Post
MBR
сообщение Sep 11 2012, 12:44
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Как ни крути, но там два таргета получается: FLASH с таблицей векторов и FLASH2, с ремапленной программой. Нужно дополнительный блок в .ld вписывать, а не просто адрес менять.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 11 2012, 13:19
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(viakon @ Sep 11 2012, 09:37) *
Есть проект для STM32 под Eclipse. Пока в скрипте линкера stm32f100rb_flash.ld строка
FLASH (rx) : ORIGIN = 0x08000000

программа работает
стоит изменить на ORIGIN = 0x08002000
все престает работать. После загрузки проги в контроллер первый же шаг в отладчике выкидывает куда-то в середину тела проги. .

Тут как мне кажется нужно две программы писать:
1) распологается с адреса 0x08000000
на выходе делает что-то типа такого
Код
typedef void (*ISRPtr) (void);
void StartSecondProgram()
{
    __set_MSP(*(uint32_t *)0x08002000);
    ISRPtr application_reset_handler=(ISRPtr)(*(uint32_t *)0x08002004);
    application_reset_handler();
}

2) вторая просто смещена на адрес 0x08002000

Go to the top of the page
 
+Quote Post
viakon
сообщение Sep 12 2012, 03:17
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



В общем разобрался добавил секцию .ld файл

.bload :
{
. = ALIGN(4);
*(.bload)
*(.bootwrite)
*(.bootprg)
*(.string)
. = ALIGN(0x2000);
} >FLASH

в результате все работает
пробовал помещать бутлоадер не в раздел FLASH тут же возникли проблемы с отладкой. при загрузке программы в контроллер происходит попытка записи в область 0x06000000, что приводит сбою в обмене по SWD. Возможно это баг openOCD.

помимо этого еще в скрипте stm32f1x.cfg пришлось установить

set _WORKAREASIZE 0x2000

было set _WORKAREASIZE 0x4000 опять же была попытка записи в память которой нет и сбой в обмене по SWD



Сообщение отредактировал viakon - Sep 12 2012, 04:59
Go to the top of the page
 
+Quote Post
MBR
сообщение Sep 12 2012, 06:24
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



что-то мне говорит, что причина может быть в инициализированных данных, которые попадают не в ту секцию. Постите тогда уж весь ld, а то гадание на кофейной гуще.
Go to the top of the page
 
+Quote Post
viakon
сообщение Sep 12 2012, 07:34
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Цитата(MBR @ Sep 12 2012, 12:24) *
что-то мне говорит, что причина может быть в инициализированных данных, которые попадают не в ту секцию. Постите тогда уж весь ld, а то гадание на кофейной гуще.

Проблема решена, может не совсем по правилам, но решена. Когда появится свободное время, покопаюсь поглубже.
Go to the top of the page
 
+Quote Post
viakon
сообщение Sep 24 2012, 05:43
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



решение здесь http://electronix.ru/forum/index.php?showtopic=106283

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

Сообщение отредактировал viakon - Sep 24 2012, 05:45
Go to the top of the page
 
+Quote Post

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

 


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


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