<목차>
1. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(1)
2. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(2)
3. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(3)
4. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(4)
5. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(5)
6. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(6)
7. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(7)
8. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(8)
5. 포팅하기 - ioLibrary Compile하기
앞 시간에는 작업 Project Directory에 ioLibrary를 설치하였다. 기본 구성이 끝났으므로 Project를 Build 해본다.
다음과 같이 17개의 Warning과 5개의 Error가 발생한다.
C51 COMPILER V9.51 - SN: K1RIC-I06RWZ COPYRIGHT Copyright (C) 2012 ARM Ltd and ARM Germany GmbH. All rights reserved. *** WARNING C318 IN LINE 46 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.h: can't open file 'Ethernet/wizchip_conf.h' make: *** [ioLibrary/Ethernet/W5500/w5500.OBJ] Error 1 *** ERROR C200 IN LINE 65 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: left side of '.' requires struct/union *** WARNING C322 IN LINE 68 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 68 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 83 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 83 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** ERROR C320 IN LINE 93 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: "Unknown _WIZCHIP_IO_MODE_ in W5000. !!!" *** WARNING C322 IN LINE 106 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 106 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 121 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 121 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** ERROR C320 IN LINE 131 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!" *** WARNING C322 IN LINE 145 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 145 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 198 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 198 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** ERROR C320 IN LINE 208 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!!" *** WARNING C322 IN LINE 222 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 222 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 275 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** WARNING C322 IN LINE 275 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier *** ERROR C320 IN LINE 285 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!!"
C51 COMPILATION COMPLETE. 17 WARNING(S), 5 ERROR(S) |
당황하지 말고 하나씩 살펴보자.
첫번째 Warning "*** WARNING C318 IN LINE 46 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.h: can't open file 'Ethernet/wizchip_conf.h'"에서 wizchip_conf.h 파일을 열수 없단다. 이는 ioLibrary Directory가 Include Path에 포함되어 있지 않기 때문이다.
- ioLibrary Directory 를 Project의 Include Path에 포함시키기
Simplicity Studio IDE의 오른쪽 창 Project Explorer에서 Project "ioLibrary_W5500"을 선택하고 우클릭한다. 그러면 Pop-up Menu가 뜨고 거기서 Properties Menu를 클릭한다.
Properties 설정 창에서 다음과 같은 순서를 따라 ioLibrary Directory를 Include Path에 등록한다.
- Project Compile하기
Include Path 등록을 마친 후 다시 컴파일을 해보자. 다음과 같이 2개의 Warning과 1개의 Error로 줄어든다.
C51 COMPILER V9.51 - SN: K1RIC-I06RWZ COPYRIGHT Copyright (C) 2012 ARM Ltd and ARM Germany GmbH. All rights reserved. *** WARNING C322 IN LINE 132 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet/wizchip_conf.h: unknown identifier
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S) Finished building: ../ioLibrary/Ethernet/W5500/w5500.c Building file: ../ioLibrary/Ethernet/socket.c Invoking: Keil 8051 Compiler C51 "@ioLibrary/Ethernet/socket.__i" || test $? -lt 2
C51 COMPILER V9.51 - SN: K1RIC-I06RWZ COPYRIGHT Copyright (C) 2012 ARM Ltd and ARM Germany GmbH. All rights reserved. *** WARNING C322 IN LINE 132 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet/wizchip_conf.h: unknown identifier *** ERROR C141 IN LINE 56 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\socket.c: syntax error near ';' make: *** [ioLibrary/Ethernet/socket.OBJ] Error 1 *** WARNING C322 IN LINE 266 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\socket.c: unknown identifier
C51 COMPILATION COMPLETE. 2 WARNING(S), 1 ERROR(S) |
첫번째 Warning을 살펴보자.
*** WARNING C322 IN LINE 132 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet/wizchip_conf.h: unknown identifier
wizchip_conf.h의 132번째 줄에 unknown identifier가 있단다.
_WIZCHIP_IO_MODE_BUS 정의에 오타가 있다. 이를 _WIZCHIP_IO_MODE_BUS_ 로 수정한다.
#if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS
#ifndef _WIZCHIP_IO_BASE_
#error "You should be define _WIZCHIP_IO_BASE_ to fit your system memory map.
#endif
#endif
두번째 Error
*** ERROR C141 IN LINE 56 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\socket.c: syntax error near ';'
socket.c 파일에서 SOCK_AY_PORT_NUM 정의할 때 세미콜론(;)를 삭제한다.
#define SOCK_ANY_PORT_NUM 0xC000;
세번째 Warring
*** WARNING C322 IN LINE 266 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\socket.c: unknown identifier
socket.c 파일에서 _WZICHIP_ 오타를 _WIZCHIP_ 으로 수정
if(tmp & Sn_IR_SENDOK)
{
setSn_IR(sn, Sn_IR_SENDOK);
#if _WZICHIP_ == 5200
if(getSn_TX_RD(sn) != sock_next_rd[sn])
{
setSn_CR(sn,Sn_CR_SEND);
while(getSn_CR(sn));
return SOCKERR_BUSY;
}
#endif
sock_is_sending &= ~(1 << sn);
}
Warning과 Error가 없을 때까지 Compile 작업을 반복 수행한다.
C51 COMPILER V9.51 - SN: K1RIC-I06RWZ COPYRIGHT Copyright (C) 2012 ARM Ltd and ARM Germany GmbH. All rights reserved. *** ERROR C141 IN LINE 57 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';' *** ERROR C141 IN LINE 63 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';' *** ERROR C141 IN LINE 69 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';' *** ERROR C141 IN LINE 75 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';' *** ERROR C141 IN LINE 83 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';' *** ERROR C141 IN LINE 92 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';' make: *** [ioLibrary/Ethernet/wizchip_conf.OBJ] Error 1 *** ERROR C141 IN LINE 99 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';' *** ERROR C141 IN LINE 105 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';' *** ERROR C141 IN LINE 112 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near '.'
C51 COMPILATION COMPLETE. 0 WARNING(S), 9 ERROR(S) |
8 Error
*** ERROR C141 IN LINE 57 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';'
wizchip_conf.c의 함수 구현시 {} 뒤에 세미콜론(;)이 붙어서 발생한 Error이므로 이를 모두 삭제한다.
void wizchip_cris_enter(void) {};
void wizchip_cris_exit(void) {};
void wizchip_cs_select(void) {};
void wizchip_cs_deselect(void) {};
uint8_t wizchip_bus_readbyte(uint32_t AddrSel) { return * ((volatile uint8_t *)((ptrdiff_t) AddrSel)); };
void wizchip_bus_writebyte(uint32_t AddrSel, uint8_t wb) { *((volatile uint8_t*)((ptrdiff_t)AddrSel)) = wb; };
uint8_t wizchip_spi_readbyte(void) {return 0;};
void wizchip_spi_writebyte(uint8_t wb) {};
1 Error
*** ERROR C141 IN LINE 112 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near '.'
이 에러는 KEIL-C compiler가 다음과 같은 STRUCTURE memberd의 초기값 설정을 지원하지 않기 때문에 발생한다.
따라서, 이 코드를 1차 배열 Assign으로 수정한다.
_WIZCHIP WIZCHIP =
{
.id = _WIZCHIP_ID_,
.if_mode = _WIZCHIP_IO_MODE_,
.CRIS._enter = wizchip_cris_enter,
.CRIS._exit = wizchip_cris_exit,
.CS._select = wizchip_cs_select,
.CS._deselect = wizchip_cs_deselect,
.IF.BUS._read_byte = wizchip_bus_readbyte,
.IF.BUS._write_byte = wizchip_bus_writebyte
// .IF.SPI._read_byte = wizchip_spi_readbyte,
// .IF.SPI._write_byte = wizchip_spi_writebyte
};
Structure member 를 삭제하고 1차배열로 할당한 코드이다.
_WIZCHIP WIZCHIP =
{
_WIZCHIP_IO_MODE_,
_WIZCHIP_ID_,
wizchip_cris_enter,
wizchip_cris_exit,
wizchip_cs_select,
wizchip_cs_deselect,
wizchip_bus_readbyte,
wizchip_bus_writebyte,
//wizchip_spi_readbyte,
//wizchip_spi_writebyte
};
위 작업을 마무리한 후 다시 컴파일 해본다. 헐 아래와 같이 18 Warning과 155 ERROR가 발생한다.
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT make: *** [ioLibrary_W5500.omf] Error 1 SYMBOL: ?_WIZ_RECV_DATA?BYTE SEGMENT: ?DT?_WIZ_RECV_DATA?W5500
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: ?_WIZ_SEND_DATA?BYTE SEGMENT: ?DT?_WIZ_SEND_DATA?W5500
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: ?_WIZCHIP_WRITE_BUF?BYTE SEGMENT: ?DT?_WIZCHIP_WRITE_BUF?W5500
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: ?_WIZCHIP_READ_BUF?BYTE SEGMENT: ?DT?_WIZCHIP_READ_BUF?W5500
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: ?_WIZCHIP_WRITE?BYTE SEGMENT: ?DT?_WIZCHIP_WRITE?W5500
Program Size: data=323.0 xdata=0 code=11868 LINK/LOCATE RUN COMPLETE. 18 WARNING(S), 155 ERROR(S) |
18 Warning은 전부 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS 인 것으로 호출되지 않은 함수에 관한 경고이다. 이는 코드 동작에 전혀 문제가 없는 Warning으로 이 Warning을 없애고자한다면 해당 Function을 찾아 모두 주석 처리해주면 된다. 여기서는 그냥 사용한다.
155 에러는 Data Segment Error로 각 Function에서 할당되어진 Data나 전역 변수등이 8051의 128 Data 영역에 할당되어 Data overflow를 야기시는 에러이다. Silab C8051F380은 4 KB 영역의 Exteranl Data(XDATA) 영역을 지원하므로 Keil-C compile의 DATA model과 Code model을 모두 Large로 변경한다. 앞서 설명한 Properties 창에서 설정을 변경해보자.
- Data & Code Model 변경하기
이상 ioLibray_BSD compile을 성공적으로 마무리 했다.
다음 시간에는 WIZnet가 제공하는 Loopback example을 포팅해보면서 생기는 문제점을 하나씩 살펴보면 해결해 나갈 것이다.
< PREV NEXT >