2016-12-06 1 views
0

STM32F411RE를 사용합니다. RAM에 메모리가 없어졌습니다. 내 플래시에 큰 변수를 저장하기로 결정했습니다. 이를 위해 section.ld에 섹션을 만들었습니다.STM32, 플래시에 저장된 변수를 다른 파일에서 업데이트 할 수 없습니다.

.large_buffer: ALIGN(4) 
    { 
     . = ALIGN(4) ; 
     *(.large_buffer.large_buffer.*) 
     . = ALIGN(4) ; 
    } >FLASH 

main.c 파일에서, 나는 다음과 같이 변수를 선언 :이 시점에서

uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used)); 

모든 것이, 버퍼가 RAM (BSS)에서 확인을 구비하고 있지이다, 나는 그것을 액세스 할 수 있으며 그것을 다시 써라.

buffer[25] = 42; 
printf("%d\n", buffer[25]); // 42 

다른 파일에서 변수를 편집하려고 할 때 문제가 발생합니다.

myFunc(uint8_t* buffer) 
{ 
    buffer[25] = 42; 
    printf("%d\n", buffer[25]); // 0 
} 

buffer (매개 변수로 전달) 다른 파일에 변경하지 않을

other.c

uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used)); 

int main() 
{ 
    myFunc(buffer); 
} 

main.c

.

내가 뭔가를 놓쳤습니까?

답변

2

플래시 메모리의 물리적 디자인 때문에 RAM에 쓰는 것과 같은 방법으로 플래시 메모리에 쓸 수 없습니다. 정확하게하려면 섹터/페이지를 지워야합니다 (MCU 데이터 시트에 지정된 ~ 1 ~ 4kB라고 가정 해 봅시다). 이유는 플래시가 0이 아닌 1 비트를 변경하려고 할 때마다 전원이 공급되지 않더라도 상태를 유지한다는 것입니다. 전체 섹터를 지울 필요가 있습니다 (지우기 후 모든 비트가 1로 설정 됨) .

플래시를 데이터 메모리로 사용할 수 없으므로 Flash를 const (읽기 전용) 값인 변수를 저장하는 것으로 사용하면 룩업 테이블이 완벽하게 맞을 것입니다 (일반적으로 stat 변수를 const로 설정하면 플래시에 넣을 수 있습니다). 플래시 쓰기 방법은 MCU의 Reference Manual을 참조하십시오.

+0

감사합니다. 플래시에 저장 버퍼 (R/W가 필요함)를 저장하는 것이 좋은 해결책입니까? – Epitouille

+0

실용적인 해결책으로 이것을 권하고 싶지 않다. 우선 플래시를 먼저 읽을 수 있도록 RAM을 절약해야한다. 쓰기/지우기는 읽기보다 훨씬 느리고 RAM 쓰기/지우기 플래시와 비교하면 더 길다. 또한 얼마나 많은 지우기 사이클을 수행 할 수 있는지에 대한 제한이 있습니다. 일반적으로 약 100k 사이클입니다. – koper89

+0

예이 문제를 이해합니다. 이 시점에서 나는 숫양을 구할 수 없어 막혔습니다. 무엇이 해결책 일 수 있습니까? 어떤 최적화가 관련이 있습니까? – Epitouille

관련 문제