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

В 05.01.2024 в 12:22, RusikOk сказал:

как можно это исправить?

добавить (NOLOAD) не в bss, а в те секции, которые не должны попасть в hex

  .SPIbufSection (NOLOAD): { *(.SPIbuf) } >Memory_B0
  .RxDecripSection (NOLOAD): { *(.RxDescripSection) } >Memory_B1
  .TxDescripSection (NOLOAD): { *(.TxDescripSection) } >Memory_B2
  .RxarraySection (NOLOAD): { *(.RxBUF) } >Memory_B3
  .TxarraySection (NOLOAD): { *(.TxBUF) } >Memory_B4 

Ну и вроде как звёздочки не хватает.

.SPIbufSection (NOLOAD): { *(.SPIbufSection*) } >Memory_B0

У меня так секция ОЗУ описана

/* Memories definition */
MEMORY
{
  CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 192K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 1024K
  SDRAM (xrw)         : ORIGIN = 0xC0000000, LENGTH = 4M 
}

.....

  .ARM.attributes 0 : { *(.ARM.attributes) }
  
  /* External RAM section */
    .sdram (NOLOAD):
    {
          *(.sdram*);
    } >SDRAM

 

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


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

STM32CubeIDE. Есть структура, расположенная не в main.c, скажем, такая

typedef struct {
  uint8_t family;
  uint8_t code[MAXDEVICES_ON_THE_BUS];
  uint8_t crc;
} RomCode; //

В отладчике хочу посмотреть её содержание. Так понимаю, что в main.c её надо определить как глобальную. Вот тут у меня и затыка - не получается, с синтаксисом явно не дружу. А, может, вообще как то это надо решать по другому. Помогите, пожалуйста, бывшему депутату государственной думы. 

Изменено пользователем Юрий48

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


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

typedef struct {
  uint8_t family;
  uint8_t code[MAXDEVICES_ON_THE_BUS];
  uint8_t crc;
} RomCode; //

RomCode romCode;//можно проинициализировать вот так = {.family = 1, .crc = 0xCA};

void main(void)
{
  for(;;)
  {
    asm("nop");
  }
}

 

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


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

9 часов назад, Юрий48 сказал:

Есть структура, расположенная не в main.c

А где она расположена? И что вы понимаете под термином "расположена"? И что значит "есть структура"? В приведенном вами коде есть объявление типа. Ни объявления (declaration), ни определения (definition) переменной, способной хранить этот тип, мы не видим (https://www.cprogramming.com/declare_vs_define.html). 

9 часов назад, Юрий48 сказал:

с синтаксисом явно не дружу.

Откройте для себя заголовочные (header) файлы. Описание структуры вам нужно поместить в такой файл и включить этот файл в main.c и в тот файл, где определена переменная с типом этой структуры. Объявление переменной можно поместить либо в заголовочный файл либо в main.c.

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


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

В 19.01.2024 в 10:11, Сергей Борщ сказал:

А где она расположена? И что вы понимаете под термином "расположена"? И что значит "есть структура"? В приведенном вами коде есть объявление типа. Ни объявления (declaration), ни определения (definition) переменной, способной хранить этот тип, мы не видим

Теперь понимаю, что вопросы совершенно резонные. Нашёл где дано определение или объявление (пока ещё не знаю как правильно) и в отладчике смог посмотреть что в них.  Спасибо за ссылки, буду постепенно разбираться, а то, конечно, стыдоба - и вопрос правильно задать не могу. Хотя если бы я мог задать его правильно, то и задавать бы его было не надо.

Изменено пользователем Юрий48

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


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

Приветствую!

Использую  STM32CubeIDE ver.1.13.1

Сталкнулся с такой проблемой. Есть проектик, он нормально компилиться. 

Но при добавлении файла с кодом и его хидера (user_lib.c  и user_lib.h), начинает ругаться на совершенно другой хидер (extend_typedef.h)

extend_typedef.h добавляется в исходники:

main.c

stm32f1xx_it.c

program.c

и добавляемый файл:   user_lib.c

 

Файл user_lib.c :

#include "stm32f1xx_it.h"
#include "extend_typedef.h"

u32 beg_time, sdelay=0;
u8 bgtim_stat=0;

/*------------------------------------------------------------------------------------------------*/
/*	start software background timer (bgtimer)   */
/*  delay in ms  */
void start_bgtimer(u32 delay)
{
	beg_time=stCounter;
	sdelay = delay;
	bgtim_stat=1;
}

/*------------------------------------------------------------------------------------------------*/
/*	if program bgtimer not elapsed = 1  */
/*  else =0                         */
u8 check_bgtimer(void)
{
	if (bgtim_stat)	if ((stCounter - beg_time)>=sdelay )  bgtim_stat=0;
	return bgtim_stat;
}

Файл user_lib.h :

#ifndef USER_LIB_H_
#define USER_LIB_H_

void start_bgtimer(u32);
u8 check_bgtimer(void);

#endif /* USER_LIB_H_ */

 

Когда удаляю эти два файла из проекта, проблема исчезает.

Думаю может я чтото незнаю про использование структуры программы по куб ?   Кто что может подсказать ?

 

stm32cube_error.jpg

Изменено пользователем MaxiMuz

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


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

добрый день! как получить значения этих переменных из *.ld файла но уже в сишном коде? или может есть какие макросы компилятора

_Min_Heap_Size = 0x200;  /* required amount of heap  */
_Min_Stack_Size = 0x460; /* required amount of stack */

 

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


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

ищется поиском по проекту

Stack_Size 

у меня в файле sturtup_stm....,s  там и размер кучи

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


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

10 часов назад, RusikOk сказал:

как получить значения этих переменных из *.ld файла но уже в сишном коде?

Во-первых надо понимать, что переменные редактора связей (линкера) и переменные программы это несколько разные вещи. Редактор связей работает с адресами и все, что он может предоставить программе - это адрес какого-либо объекта. То есть в Си-программе это будет значение указателя на объект и надо будет сделать явное приведение типа:

extern int _Min_Heap_Size;			// <- вместо int тут может быть любой тип (кроме void).
size_t Min_Heap_size = (size_t)&_Min_Heap_Size;

Можно воспользоваться тем фактом, что имя массива неявно приводится к указателю на его первый элемент:

extern int _Min_Heap_Size[];			// <- вместо int тут может быть любой тип (кроме void).
size_t Min_Heap_size = (size_t)_Min_Heap_Size;

 

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


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

10 hours ago, RusikOk said:

добрый день! как получить значения этих переменных из *.ld файла но уже в сишном коде? или может есть какие макросы компилятора

_Min_Heap_Size = 0x200;  /* required amount of heap  */
_Min_Stack_Size = 0x460; /* required amount of stack */

 

Очень просто. Дело в том, что у линковщика тоже есть переменные, которые он на этапе связывания может передать в программу пользователя.

Оставил только то, что относится к сути вопроса.

Скрипт линкёра, в котором создаётся переменная _estack.

/**
 ******************************************************************************
 * @file      LinkerScript.ld
 
....

/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of "RAM" Ram type memory */

Далее в стартап-файле (у меня он свой) описываем эту переменную:

////////////////////////////////////////////////////////////////////////////////
//
//  startup_stm32f446xx.cpp
//
////////////////////////////////////////////////////////////////////////////////

// GCC ARM compatible

....  
  
extern void *_sidata, *_sdata, *_edata;
extern void *_sbss, *_ebss;
extern void *_estack;				// вот описание этой переменная из линковщика

....

const intfunc
__vector_table[] __attribute__ ( ( section (".isr_vector_FLASH" ), used ) ) =
{
  (intfunc)&_estack ,			// значение этой переменной вычислит и подставит линковщик
  &Reset_Handler,
  &NMI_Handler,
  &HardFault_Handler,
  &MemManage_Handler,
  &BusFault_Handler,
...

Значения переменных

_Min_Heap_Size = 0x800;   /* required amount of heap  */
_Min_Stack_Size = 2K;   /* required amount of stack */

используются точно также. Мне в стартапе они не нужны, поэтому прмер привёл для _estack.

Изменено пользователем tonyk_av

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


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

наверное нада было сразу написать, что я хочу получить.

в общем в *.ld я выделяю участок памяти для массива RAM_SPI_DMA

MEMORY
{
	FLASH(rx)		: ORIGIN = 0x08040000, LENGTH = 256K
	RAM(xrw)        	: ORIGIN = 0x20000000, LENGTH = 128K 	/* DTCM (64k) SRAM1 (240k) SRAM2 (16k) */
	RAM_ETH_DMA_RX(xrw)	: ORIGIN = 0x20018000, LENGTH = 0x100	/* Ethernet Rx DMA Descriptors */
	RAM_ETH_DMA_TX(xrw)	: ORIGIN = 0x20018100, LENGTH = 0x100	/* Ethernet Tx DMA Descriptors */
	RAM_ETH_RX(xrw)   	: ORIGIN = 0x20018200, LENGTH = 1524 * 8	/* Ethernet Receive Buffers */
	RAM_ETH_TX(xrw)   	: ORIGIN = 0x2001B1A0, LENGTH = 1524 * 8	/* Ethernet Transmit Buffers */
	RAM_SPI_DMA(xrw)	: ORIGIN = 0x20020000, LENGTH = 192K - _Min_Heap_Size - _Min_Stack_Size 	/* участок для данных от SPI */
}

в *.с хочу объявлять статический массив не парясь про его размер, хочу чтобы компилятор сам разобрался с размером. но если массив статический то его размер компилятору нада знать до компиляции и потому использование переменных _Min_Heap_Size и _Min_Stack_Size не проконало. следующий код тоже не работает(

trace_t     masterBuf[LENGTH(RAM_SPI_DMA) / sizeof(trace_t)] __attribute__((section(".SPIbufSection")));
trace_t     masterBuf[LENGTH(SPIbufSection) / sizeof(trace_t)] __attribute__((section(".SPIbufSection")));

 

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


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

Так создание статического массива не использует ни одну из указанных констант. Компилятор (линкер) как раз "искаропки" и разбирается самостоятельно с размером массива. Вы можете разве что поместить массив в другую SRAM, указав секцию, а там уж линкер разберется, куда положить. Абсолютный адрес массива не важен, важно лишь попадание массива в нужный диапазон адресов.

Изменено пользователем EdgeAligned

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


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

идея в том, чтобы при изменении размера кучи или стека размер массива тоже уменьшился но в то же время был максимально допустимым для этой секции

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


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

1 hour ago, RusikOk said:

идея в том, чтобы при изменении размера кучи или стека размер массива тоже уменьшился но в то же время был максимально допустимым для этой секции

1. Размер секции известен.

2. Начало массива известно.

3. Вычитаем п.2 из п.1 и получаем размер массива.

Куда уж проще ?

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


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

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

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

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

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

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

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

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

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

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