haker_fox 61 19 декабря, 2022 Опубликовано 19 декабря, 2022 · Жалоба 2 minutes ago, dimka76 said: Или сразу после таблицы В таком случае понадобится модификация скрипта линкера, а автор хочет уйти от этого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 19 декабря, 2022 Опубликовано 19 декабря, 2022 · Жалоба On 12/19/2022 at 10:09 AM, haker_fox said: В таком случае понадобится модификация скрипта линкера, а автор хочет уйти от этого. Не понадобится. В конец таблицы добавить еще один элемент (вектор) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 19 декабря, 2022 Опубликовано 19 декабря, 2022 · Жалоба 23 минуты назад, dimka76 сказал: В конец таблицы добавить еще один элемент (вектор) Что-то я не подумал, что стартап и таблица векторов это тоже одно из табу на редактирование :))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 19 декабря, 2022 Опубликовано 19 декабря, 2022 · Жалоба 47 minutes ago, dimka76 said: В конец таблицы добавить еще один элемент (вектор) Я воспринял Ваше предложение 1 hour ago, dimka76 said: Или сразу после таблицы как предложение разместить данные после всей таблицы, которая отведена в архитектуре под адреса обработчиков прерываний. У меня startup-файл содержит обработчики для всех векторов, даже неиспользуемых. Вот и подумал машинально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 44 19 декабря, 2022 Опубликовано 19 декабря, 2022 · Жалоба 20 hours ago, jenya7 said: #pragma location = 0x00003FD8 Зачем явно указывать адрес? Ищем приключений? Линковщик способен сам рассчитать адрес для размещения и во время линковки правильно поставить адрес, достаточно рассказать ему о своих желаниях. Описал физическую память своего МК, глядя в даташит и исходя из своих потребностей: * Memories definition */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K SECTOR_0 (rx) : ORIGIN = 0x08000000, LENGTH = 16K SECTOR_1_2 (rx) : ORIGIN = 0x08004000, LENGTH = 32K SECTOR_3 (rx) : ORIGIN = 0x0800C000, LENGTH = 16K SECTOR_4 (rx) : ORIGIN = 0x08010000, LENGTH = 64K /* Reserved */ SECTOR_5_7 (rx) : ORIGIN = 0x08020000, LENGTH = 384K } Описываешь секцию данных: /* Sections */ SECTIONS { /* The startup code into "FLASH" Rom type memory */ .isr_vector_FLASH : { . = ALIGN(4); KEEP(*(.isr_vector_FLASH)) /* Startup code */ . = ALIGN(4); } >SECTOR_0 .... .plc_prog : { /*. = ALIGN(2);*/ KEEP (*(.plc_prog)) . = ALIGN(2); } >SECTOR_1_2 И спокойно помещаешь свои данные в нужную секцию: const uint16 __PLC_prog[ MAX_STEP ] \ __attribute__ ( (section( ".plc_prog" ), used ) ) = { 0x2800, 0xC801, 0x001C, // -|M0|-(M1)- 0xFFFF, // ----[FEND]- 0x000F // -----[END]- }; При переносе на другой МК, имеющий другую структуру и адреса памяти, достаточно изменить адреса в скрипте линкёра, не трогая программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 19 декабря, 2022 Опубликовано 19 декабря, 2022 · Жалоба Линковщик раблтает в пределах одной прошивки. А требуется чтобы сторонняя прошивка по какому-то фиксированному адресу нашла нужные данные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 декабря, 2022 Опубликовано 19 декабря, 2022 · Жалоба On 12/19/2022 at 8:23 AM, VladislavS said: Magic Number проще всего положить в незадействованый вектор в таблице векторов прерываний. интересно. но таблица векторов read only. void (* const g_pfnVectors[])(void) = { // Core Level - CM4 &_vStackTop, // The initial stack pointer ResetISR, // The reset handler NMI_Handler, // The NMI handler HardFault_Handler, // The hard fault handler MemManage_Handler, // The MPU fault handler BusFault_Handler, // The bus fault handler UsageFault_Handler, // The usage fault handler 0, // Reserved - 7 - magic number 0, // Reserved 0, // Reserved 0, // Reserved SVC_Handler, // SVCall handler DebugMon_Handler, // Debug monitor handler 0, // Reserved PendSV_Handler, // The PendSV handler SysTick_Handler, // The SysTick handler //и так далее } к тому же это таблица указателей на обработчики прерываний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 19 декабря, 2022 Опубликовано 19 декабря, 2022 · Жалоба 17 минут назад, jenya7 сказал: интересно. но таблица векторов read only. А вам эти данные еще и менять надо было? В исходной задаче об этом ни слова. 17 минут назад, jenya7 сказал: к тому же это таблица указателей на обработчики прерываний. Обратите внимание на ее первый элемент. Что там? Неужто указатель на обработчик? Оставим пока за скобками авторов этих файлов, ниасиливших описать этот участок памяти в виде структуры из правильных типов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 декабря, 2022 Опубликовано 19 декабря, 2022 (изменено) · Жалоба On 12/19/2022 at 3:29 PM, Сергей Борщ said: А вам эти данные еще и менять надо было? В исходной задаче об этом ни слова. Обратите внимание на ее первый элемент. Что там? Неужто указатель? Оставим пока за скобками авторов этих файлов, ниасиливших описать этот участок памяти в виде структуры из правильных типов. первый элемент? extern void _vStackTop(void); не указатель? ну если только так void (* const g_pfnVectors[])(void) = { .......... (void *)0x1234, // Reserved - 7 - magic number ........... } и потом if (g_pfnVectors[7] == (void*) 0x1234) Изменено 19 декабря, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 44 19 декабря, 2022 Опубликовано 19 декабря, 2022 · Жалоба 3 hours ago, VladislavS said: А требуется чтобы сторонняя прошивка по какому-то фиксированному адресу нашла нужные данные. Ну так достаточно разместить нужную секцию по известному адресу, например, так: 3 hours ago, tonyk_av said: SECTOR_4 (rx) : ORIGIN = 0x08010000, LENGTH = 64K /* Reserved */ 1 hour ago, jenya7 said: но таблица векторов read only. Это она в секции, находящейся во флэш только для чтения. У меня, например, таблица векторов находятся в ОЗУ, куда перемещается после старта: /* Initialized data sections into "RAM" Ram type memory */ .isr_vector_RAM : { . = ALIGN(4); KEEP(*(.isr_vector_RAM)) PROVIDE_HIDDEN ( __isr_vector_RAM = .); . = ALIGN(4); } >RAM //////////////////////////////////////////////////////////////////////////////// // // startup_stm32f407xx.cpp // //////////////////////////////////////////////////////////////////////////////// ..... #if defined( __VECTORS_IN_RAM__) || defined( __DEBUG_SRAM__ ) IRQ::moveVectorsToRAM(); #endif ...... Нет никаких проблем, чтобы изменить адрес вектора в ОЗУ и скинуть их обратно во флэш. Один вопрос: нафига? Зарезервируй под свои нужды сектор или сегмент в ОЗУ, и пиши в него сколько хочешь. Единственное неудобство есть у STM32F4 и F7 с их большим размерами секторов, что делает не всегда удобным обновление нескольких байт во флэш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться