2011-12-02 5 views
1

STM32 개발을 위해 uvision IDE를 사용하여, 시작시 초기화되지 않은 일부 타이머 변수를 갖고 싶습니다.STM32 : 초기화되지 않은 변수?

volatile unsigned int system_time __attribute__((section(".noinit"))); 

__attribute__((zero_init)) volatile int system_timer; 

을하지만 아무것도 작동하는 것 같다 없다 : 나는 노력했다. elswhere의 힌트에 따라 옵션/대상/IRAM1에서 NoInit를 추가로 점검했습니다. 여전히 변수는 재설정 후 0으로 설정됩니다.

아무도 도와 줄 수 있습니까?

답변

3

당신은 .MAP 파일에서 해당 변수의 주소를 확인하여 더 키워드에서

당신이 당신의 C 소스 파일에서 초기화되지 않은 변수의 주소를 지정할 수 사용해야합니다.

다음의 예는 내가이 문제를 해결하기 위해 도움이되기를 바랍니다

struct link { 
    struct link idata *next; 
    char  code *test; 
}; 

struct link idata list _at_ 0x40;  /* list at idata 0x40 */ 
char xdata text[256] _at_ 0xE000; /* array at xdata 0xE000 */ 
int xdata i1   _at_ 0x8000; /* int at xdata 0x8000 */ 
char far ftext[256] _at_ 0x02E000; /* array at xdata 0x03E000 */ 

void main (void) { 
    link.next = (void *) 0; 
    i1  = 0x1234; 
    text [0] = 'a'; 
    ftext[0] = 'f'; 
} 

...... 에서 keyword.for 예를 사용하여 여러 가지 변수 유형을 찾는 방법을 보여줍니다.

3

다음 단계를 수행해야합니다. 다음과 같이 당신의 변수를 선언 :

volatile unsigned int system_time __attribute__((section(".noinit"),zero_init)); 

그런 다음 당신은 NOINIT 속성으로 실행 섹션을 선언하고 링커와 함께 사용하는 스 캐터 파일을 사용해야합니다. 스 캐터 파일 예제 :

LR_IROM1 0x08000000 0x00080000 { ; load region size_region 
    ER_IROM1 0x08000000 0x00080000 { ; load address = execution address 
     *.o (RESET, +First) 
     *(InRoot$$Sections) 
     .ANY (+RO) 
    } 
    RW_IRAM1 0x20000000 UNINIT 0x00000100 { ;no init section 
     *(.noinit) 
    } 
    RW_IRAM2 0x20000100 0x0000FFF0 {    ;all other rw data 
     .ANY(+RW +ZI) 
    } 
}