공부/STM82013.03.05 11:36

STM8S 에서 RAM상주 함수 만들기

 

STM8S에서 IAP 소스상에서 Flash 를 Block 으로 쓰기 위해서 RAM 상주 함수를 만들어서 사용하는데 ,

이유는 Flash를 1byte, 4byte,Block 단위 로 쓸수 있는데, 한번 쓸때 걸리는 시간이 3ms 정도다. 즉 1byte 를 쓰나 Block 단위로

쓰나 시간은 동일하다는 것이다. 문제는 1byte 와 4byte 는 flash 에서 쓸수 있으나 Block 은 RAM 에서만 쓸수 있다고

되어 있다. 시간을 줄이기 위해서는 무조건 Block으로 써야 한다.

 

그래서 IAP 소스를 살펴보니  아래와 같이 선언되어 있고

 

#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)

 

icf 파일에

 

initialize by copy { rw, ro section .tiny.rodata, section FLASH_CODE};

 

로 선언이 되어 있었다.

 

이부분을 예제 파일쪽에서 사용해 보기 위해서 예제 소스의 icf 파일에 아래처럼 되어 있는데

 

// Initialization
initialize by copy { rw section .far.bss,
                     rw section .far.data,
                     rw section .far_func.textrw,
                     rw section .huge.bss,
                     rw section .huge.data,
                     rw section .huge_func.textrw,
                     rw section .iar.dynexit,
                     rw section .near.bss,
                     rw section .near.data,
                     rw section .near_func.textrw,
                     rw section .tiny.bss,
                     rw section .tiny.data,
                     ro section .tiny.rodata};

 

이것을 아래 처럼 수정하고 해당 함수를 소스에 추가 해서 컴파일 했다.

 

// Initialization
initialize by copy { rw section .far.bss,
                     rw section .far.data,
                     rw section .far_func.textrw,
                     rw section .huge.bss,
                     rw section .huge.data,
                     rw section .huge_func.textrw,
                     rw section .iar.dynexit,
                     rw section .near.bss,
                     rw section .near.data,
                     rw section .near_func.textrw,
                     rw section .tiny.bss,
                     rw section .tiny.data,

rw,ro section .tiny.rodata ,section FLASH_CODE };

 

linker 에서 에러가 났다.

그래서 ro section .tiny.rodata ,section FLASH_CODE }; 로 수정했다.

 

그래도 linker 에서 에러가 났다.

 

IAR 메뉴얼에도 정확하게 표기가 안되어 있어서 고민중에 다른 사이트에서 ramfunc keyword를 찾아서 icf 파일은

원래대로 나두고 아래 처럼만 수정 했다.

 

__ramfunc void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)

 

이상 없이 컴파일 잘된다.

 

map 파일을 보면 아래처럼 되어 있다.

 

Mem_ProgramBlock        0x000010   0xd7  Code  Gb  util.o [1]

 

즉 0x000010 번지 (즉 RAM영억) 에 0xd7을 차지하는 Code 가 잡힌다는 것이다.

 

해결....

 

해당내용에 대한 사이트 링크 한다.

 

http://www.embeddedworld.co.kr/atl/view.asp?a_id=5681

 

 

 

 

 

 

 

Posted by 큰파도