2009-03-04 1 views
2

저는 마이크로 칩의 무료 TCP/IP (버전 4.55) 스택을 8 비트 마이크로 컨트롤러에서 사용하고 있습니다.보드 리셋없이 마이크로 칩의 TCP/IP 스택을 리셋 할 수 있습니까?

asm ("RESET")으로 전체 보드를 재설정하지 않고 스택을 재설정하려고합니다.

이 스택을 다시 시작하는 방법에 대한 아이디어.

UPDATE

I는 다음과 같이 마이크로 칩 이더넷 칩

  • 통화 StackInit()에서의 리셋 핀 토글

    1. 와 스택 재설정;
    2. 수동으로 UDP는 상태 머신

    이 내가 발견 치명적인 SPI 오류를 복구하는 것 같다 발표 재설정합니다.

  • 답변

    3

    호출 StackInit(). 이 기능은 모든 하위 모듈 (TCP, UDP, SMTP 등)을 다시 초기화합니다. 또한 열어 놓은 모든 TCP 및 UDP 소켓을 손상 시키므로 사용하려는 소켓을 다시 열어야합니다.

    사이드 노트로 : 나는 마이크로 칩 포럼의 스레드를 따라 갔다. 나는 또한 TCP 스택에서 이상한 재설정을 얻고 있었다. 결국 스택 오버 플로우가 발생했습니다. 스택의 맨 위에 몇 가지 변수를 추가하십시오.

    #pragma udata stackoverflow = 0xE00 
    UInt32 StackUpperBound[8]; 
    #pragma udata 
    

    main()의 시작 부분에서 이러한 변수를 초기화하고 처음에 중단 점을 넣습니다. 이러한 변수를 덮어 쓰는 지 확인하십시오.

    +0

    StackInit()을 호출했지만 연결 후 TCP 소켓을 다시 가져올 수 없습니다. 빈 배열 StackUpperBound는 어디에 두었습니까? 주 파일 또는 스택의 어딘가에 저장하십시오. –

    +0

    또한 자신 만의 블록을 만든 이유가 무엇입니까? (stackoverflow) –

    +0

    링커 파일에서 내 스택은 0xD00에 있으며 길이는 0x100 바이트입니다. 그래서 내 변수를 넣는 것은 0xE00이 스택의 맨 위에있다. 나는 습관으로 정의하는 블록에 항상 이름을 부여합니다. main()에서 StackUpperBound를 DEADBEEF로 초기화하는 루프가 있습니다. – Robert

    0

    저는 마이크로 칩 스택에 익숙하지 않지만, 스택이 다시 시작되도록 설계되지 않았다면 성공할 것입니다.

    모든 버퍼와 구조체가 정적으로 할당 된 경우 이론적으로 초기화 루틴을 호출하여 스택을 "다시 시작"할 수 있습니다 (구조체를 다시 초기화한다고 가정).

    동적 버퍼 (malloc)를 사용하는 경우 운이 좋지 않을 것입니다.

    관련 문제