[TIDA-01547] 코드 분석 - host_api.c의 initHostConfig() 함수
이 포스팅은 ti 측에서 제공하는 TIDA 01547 예제와 그에 대한 document들을 기반으로 해 작성되었습니다. (출처: http://www.ti.com/tool/TIDA-01547)
이 예제에서 쓰는 APIMAC_STD_US_915_PHY_1의 reference
Reference인 host_api.c로 들어간 결과, 여기서 band를 설정해줄 수 있었다.
이 6lowpan 예제의 software부분은 총 3가지로 나뉜다.
Host interface layer, 6LoWPAN mesh stacks, application layer
< Host interface layer (UART interface with TI-15.4 stack in CC1310) >
1. 먼저 host_tx_task를 보자.
1) initialize TI-15.4 stack (INIT)
2) maintain MAC-level keep-alive mechanism
3) handling message timeout and erroneous transmissions
4) maintain host state machine and performing FH synchronization
먼저 powered up, device starts with INIT state
to reset TI-15.4 stack,
to configure MAC PIB and FH PIBs
to start the PAN as node
그리고, device가 FH synchronization 과정을 시작하면, FH_SYNC state로 간다.
그리고, FH synchronization을 complete하면, JOINED state로 간다.
이렇게 JOINED state로 갔을 때, 이 host_tx_task는 위의 layer에게 (6LoWPAN mesh stack?) ready-to-send data를 보냄으로써 알린다.
(그니까, 이제 FH network에 join했으니까 root(data collector)와 node(end node)간의 data 통신이 가능해지는 거지. 그러면 무조건 root를 먼저 JOINED 상태에 갖다놔야겠네 꼭 그럴 필요는 없는 것 같기도?)
왜냐하면, FH sync에서 node가 모든 FH channel들에게 PAS를 보내잖아?
TI-15.4-STACT-CoP(Coprocessor) interface는 두 종류의 Monitor and Test (MT) frame을 정한다.
(Standard와 Extended)
그 MT frame은 Host와 CoP device간의 commands와 data를 전송하는 데에 쓰인다.
MT frame은 UART Transport Frame의 General Format Frame 부분을 차지한다. (host_rx_task가 TI-15.4 stack으로부터 들어온 UART message를 처리함)
<<host_api.c>>
initHostConfig()에 들어오면
root인지 node인지에 따라 다르게 인도한다. (build configuration을 root로 설정하면predefined symbol로 IS_ROOT = 1로 설정되고, node로 설정하면 IS_ROOT = 0으로 설정된다)
나는 지금 root example이니까 root를 본다.
1. 이 함수는 처음에 memset을 통해 memory를 초기화한다.
<memset>
hostConfig, scanResult, hostState, etxMetric
2. 이건 #if, #endif로 전처리문 (컴파일 이전에 다음 코드를 수행함)
hostConfig의 panCoord를 true (node면 false)
panId를 0x1234 (node면 0x0000)
shortAddr을 0x0000 (node일 때는 없음)>>이게 INIT에서 start the PAN
3. 사용할 주파수 band에 따라 PHY 계층 값을 조정할 수 있다.
hostConfig의 phyID를 US로 설정
그리고 US나 ETS면 hostConfig의 channelPage를 APIMAC_CHANNEL_PAGE_9를 쓰고,
그외는 APIMAC_CHANNEL_PAGE_10을 쓴다.
4. 그리고 FH configuration으로 들어간다.
먼저 memset으로 FHConfig를 잡고.
FHConfig의 chHopFunc, num_nonSleepyNode, num_sleepyNode, routeCost를 여기서 define해놓은 값들로 설정해준다.
5. 그리고 #if 전처리문을 통해 root와 node를 구별
Root면, FHConfig의 routeCost를 root의 routeCost로
eapolReady
fanTpsVersion
panSize
routingMethod
useParentBSIE를 설정해준다.
Node면, FHConfig의 myRouteCost를 routeCost로 설정해준다.
6. 그리고 여기 FEATURE_MAC_SECURITY가 정의되어 있냐 아니냐에 따라서도 값 정의해주는 것이 바뀐다. (근데, Figure 20. Host Message Sequence to Configure TI-15.4 Stack to FH Mode에 따르면 없어도 괜찮은 것 같다. 이 예제에서는 predefined symbol에 이미 정의되어 있다.)
7. memset hostDevEntry
8. INIT transition table size를 정한다. initCmdTable로
이 initCmdTable은 define initial host message sequence to configure the TI-15.4 stack to FH mode with active 129 channels in the FCC band.
>> 그니까 얘가 TI-15.4 stack에서 FH mode를 선택하게 하는 부분 인거임 그리고 여기서 multihop 설정해줄 때 나오는 extended address도 pass한다~
(root랑 node의 host message sequence는 다름!)
이 initCmdTable의 구조는 다음과 같다.
MT_MAC_FH_SET_REQ랑 MT_MAC_SET_REQ는 각각 FH PIB와 MAC PIB를 설정한다.
(PIB란, PAN Information Base) 오 이거에 따라 PAS 등이 만들어지나?
MT_MAC_WRITE_KEY_REQ랑 MT_MAC_SECURITY_SET_REQ는 TI-15.4 stack의 security parameter를 설정한다. (얘네는 MAC_SECURITY define해야 나오는 애들)
MT_UTIL_GET_EXT_ADDR는 TI-15.4 stack으로부터 unique “factory-programmed” extended address를 받기 위한 command이다.
MT_UTIL_RANDOM command는 TI-15.4 stack의 FH mode를 설정해주는 것과는 관련 없지만, RPL의 trickle algorithm과 host interface layer에 쓰이는 true random values를 얻는 데에 사용된다.
MT_MAC_START_REQ command는 root나 end node로써 FH network를 시작하게 한다.
9. 그리고, stop clocks
PASTimer, PCSTimer, TrickleTimer, scanTimer, msgTimer, dataTimer 모두 stop
아 여기는 init부분이니까 일단 모든 timer를 정지시켜 놓고, 각 task에 들어가면 clock을 구동시키나 보다.
10. #ifdef KEEP_ALIVE이면
kaTxTimer랑 kaRxTimer clock도 stop
11. 이제 semaphore를 post, reset 한다.
Semaphore는 프로세서의 순차적인 처리를 위해 만든 것이라고 한다. (프로세서 간의 경쟁을 막는, 운영체제에서 많이 쓰이는 동기화 기법.)
Binary semaphore인 hostTxSem은 task가 TI-15.4 stack으로부터 컨펌을 받지 않고서 1개의 host message 보다 많이 보내는 것을 막는다.
(참고로, internal task들은 서로 mailbox(host_mailbox)를 통해 communicate한다. 그리고 그 mailbox는 최대 20개의 host message를 담을 수 있다.)
그래서 여기서는 hostTxSem과 hostRxSem을 post하고, dataSem을 0으로 reset한다.
(무조건 host message는 TI-15.4 stack에게 보내는건가?)
12. Init extended header state machine (memset inFCB)
13. Init trickle timers
PCS, PA, PAS, PC TrickleTime을 모두 init함
14. Turn off LED2/ LED3
Green 이랑 blue LED 끄네
이 green이랑 blue led는 나중 state에서 다시 등장한다.
1. TI-15.4 PHY Configuration
경로: 6lowpan_lib/host-api/api_mac.h
경로: 6lowpan_lib/host-api/api_mac.h
이 예제에서 쓰는 APIMAC_STD_US_915_PHY_1의 reference
Reference인 host_api.c로 들어간 결과, 여기서 band를 설정해줄 수 있었다.
이 6lowpan 예제의 software부분은 총 3가지로 나뉜다.
Host interface layer, 6LoWPAN mesh stacks, application layer
< Host interface layer (UART interface with TI-15.4 stack in CC1310) >
1. 먼저 host_tx_task를 보자.
1) initialize TI-15.4 stack (INIT)
2) maintain MAC-level keep-alive mechanism
3) handling message timeout and erroneous transmissions
4) maintain host state machine and performing FH synchronization
먼저 powered up, device starts with INIT state
to reset TI-15.4 stack,
to configure MAC PIB and FH PIBs
to start the PAN as node
그리고, device가 FH synchronization 과정을 시작하면, FH_SYNC state로 간다.
그리고, FH synchronization을 complete하면, JOINED state로 간다.
이렇게 JOINED state로 갔을 때, 이 host_tx_task는 위의 layer에게 (6LoWPAN mesh stack?) ready-to-send data를 보냄으로써 알린다.
(그니까, 이제 FH network에 join했으니까 root(data collector)와 node(end node)간의 data 통신이 가능해지는 거지. 그러면 무조건 root를 먼저 JOINED 상태에 갖다놔야겠네 꼭 그럴 필요는 없는 것 같기도?)
왜냐하면, FH sync에서 node가 모든 FH channel들에게 PAS를 보내잖아?
TI-15.4-STACT-CoP(Coprocessor) interface는 두 종류의 Monitor and Test (MT) frame을 정한다.
(Standard와 Extended)
그 MT frame은 Host와 CoP device간의 commands와 data를 전송하는 데에 쓰인다.
MT frame은 UART Transport Frame의 General Format Frame 부분을 차지한다. (host_rx_task가 TI-15.4 stack으로부터 들어온 UART message를 처리함)
<<host_api.c>>
initHostConfig()에 들어오면
root인지 node인지에 따라 다르게 인도한다. (build configuration을 root로 설정하면predefined symbol로 IS_ROOT = 1로 설정되고, node로 설정하면 IS_ROOT = 0으로 설정된다)
나는 지금 root example이니까 root를 본다.
1. 이 함수는 처음에 memset을 통해 memory를 초기화한다.
<memset>
hostConfig, scanResult, hostState, etxMetric
2. 이건 #if, #endif로 전처리문 (컴파일 이전에 다음 코드를 수행함)
hostConfig의 panCoord를 true (node면 false)
panId를 0x1234 (node면 0x0000)
shortAddr을 0x0000 (node일 때는 없음)>>이게 INIT에서 start the PAN
3. 사용할 주파수 band에 따라 PHY 계층 값을 조정할 수 있다.
hostConfig의 phyID를 US로 설정
그리고 US나 ETS면 hostConfig의 channelPage를 APIMAC_CHANNEL_PAGE_9를 쓰고,
그외는 APIMAC_CHANNEL_PAGE_10을 쓴다.
4. 그리고 FH configuration으로 들어간다.
먼저 memset으로 FHConfig를 잡고.
FHConfig의 chHopFunc, num_nonSleepyNode, num_sleepyNode, routeCost를 여기서 define해놓은 값들로 설정해준다.
5. 그리고 #if 전처리문을 통해 root와 node를 구별
Root면, FHConfig의 routeCost를 root의 routeCost로
eapolReady
fanTpsVersion
panSize
routingMethod
useParentBSIE를 설정해준다.
Node면, FHConfig의 myRouteCost를 routeCost로 설정해준다.
6. 그리고 여기 FEATURE_MAC_SECURITY가 정의되어 있냐 아니냐에 따라서도 값 정의해주는 것이 바뀐다. (근데, Figure 20. Host Message Sequence to Configure TI-15.4 Stack to FH Mode에 따르면 없어도 괜찮은 것 같다. 이 예제에서는 predefined symbol에 이미 정의되어 있다.)
7. memset hostDevEntry
8. INIT transition table size를 정한다. initCmdTable로
이 initCmdTable은 define initial host message sequence to configure the TI-15.4 stack to FH mode with active 129 channels in the FCC band.
>> 그니까 얘가 TI-15.4 stack에서 FH mode를 선택하게 하는 부분 인거임 그리고 여기서 multihop 설정해줄 때 나오는 extended address도 pass한다~
(root랑 node의 host message sequence는 다름!)
이 initCmdTable의 구조는 다음과 같다.
MT_MAC_FH_SET_REQ랑 MT_MAC_SET_REQ는 각각 FH PIB와 MAC PIB를 설정한다.
(PIB란, PAN Information Base) 오 이거에 따라 PAS 등이 만들어지나?
MT_MAC_WRITE_KEY_REQ랑 MT_MAC_SECURITY_SET_REQ는 TI-15.4 stack의 security parameter를 설정한다. (얘네는 MAC_SECURITY define해야 나오는 애들)
MT_UTIL_GET_EXT_ADDR는 TI-15.4 stack으로부터 unique “factory-programmed” extended address를 받기 위한 command이다.
MT_UTIL_RANDOM command는 TI-15.4 stack의 FH mode를 설정해주는 것과는 관련 없지만, RPL의 trickle algorithm과 host interface layer에 쓰이는 true random values를 얻는 데에 사용된다.
MT_MAC_START_REQ command는 root나 end node로써 FH network를 시작하게 한다.
9. 그리고, stop clocks
PASTimer, PCSTimer, TrickleTimer, scanTimer, msgTimer, dataTimer 모두 stop
아 여기는 init부분이니까 일단 모든 timer를 정지시켜 놓고, 각 task에 들어가면 clock을 구동시키나 보다.
10. #ifdef KEEP_ALIVE이면
kaTxTimer랑 kaRxTimer clock도 stop
11. 이제 semaphore를 post, reset 한다.
Semaphore는 프로세서의 순차적인 처리를 위해 만든 것이라고 한다. (프로세서 간의 경쟁을 막는, 운영체제에서 많이 쓰이는 동기화 기법.)
Binary semaphore인 hostTxSem은 task가 TI-15.4 stack으로부터 컨펌을 받지 않고서 1개의 host message 보다 많이 보내는 것을 막는다.
(참고로, internal task들은 서로 mailbox(host_mailbox)를 통해 communicate한다. 그리고 그 mailbox는 최대 20개의 host message를 담을 수 있다.)
그래서 여기서는 hostTxSem과 hostRxSem을 post하고, dataSem을 0으로 reset한다.
(무조건 host message는 TI-15.4 stack에게 보내는건가?)
12. Init extended header state machine (memset inFCB)
13. Init trickle timers
PCS, PA, PAS, PC TrickleTime을 모두 init함
14. Turn off LED2/ LED3
Green 이랑 blue LED 끄네
이 green이랑 blue led는 나중 state에서 다시 등장한다.




plandignest-shi David Miller Download
답글삭제counrichanpo