odroid c1+ 제품 kit, spi 통신 지연

Post Reply
m.s.P
Posts: 25
Joined: Wed Nov 13, 2019 12:48 pm
languages_spoken: korean & english
ODROIDs: odroid c1+
Has thanked: 1 time
Been thanked: 0
Contact:

odroid c1+ 제품 kit, spi 통신 지연

Unread post by m.s.P » Tue Feb 04, 2020 9:36 am

안녕하세요.
odroid c1+ 사용중인 유저입니다.

mcp251x module을 통해 외부와 CAN 통신을 수행하고 있습니다. (spi 통신을 이용하여 mp2515 chip을 통해..)

여러가지 테스트 및 측정 결과,
mcp251x.c 코드 내 mcp251x_can_ist irq에서 routine이 수행될 때 spi_sync() 및 netif_rx_ni(skb) 부분에서 소요시간이 크더군요.

대략 spi_sync()는 30 ~ 60us정도 소요되고, netif_rx_ni(skb)에서도 비슷하게 소요되어
여러 CAN message가 동시에 몰리는 경우에 1M bps로 CAN 통신을 수행하기에 어려울 때가 있습니다. (신호를 놓치는 경우가 여럿 있습니다.)

또한, spi_sync()는 간혹 500us정도 비약적으로 수행시간이 늘어나는 경우가 있습니다.

혹시 이를 개선할 방안이 있을까요?

감사합니다.

User avatar
odroid
Site Admin
Posts: 33336
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English
ODROIDs: ODROID
Has thanked: 384 times
Been thanked: 454 times
Contact:

Re: odroid c1+ 제품 kit, spi 통신 지연

Unread post by odroid » Tue Feb 04, 2020 10:49 am

overhead가 많은 부분을 찾아서 원인 분석을 해보아야 할텐데, 죄송스럽게도 저희는 CAN 통신에 대한 실제 경험이 전혀 없어서 도움을 드리기 어렵습니다.
SPI 버스는 주로 단방향 출력인 그래픽 LCD 인터페이스 위주로만 사용해 보았습니다.

혹시 오실로스코프로 측정된 SPI CLK의 주파수를 알수 있을까요?

m.s.P
Posts: 25
Joined: Wed Nov 13, 2019 12:48 pm
languages_spoken: korean & english
ODROIDs: odroid c1+
Has thanked: 1 time
Been thanked: 0
Contact:

Re: odroid c1+ 제품 kit, spi 통신 지연

Unread post by m.s.P » Tue Feb 04, 2020 11:11 am

odroid wrote:
Tue Feb 04, 2020 10:49 am
overhead가 많은 부분을 찾아서 원인 분석을 해보아야 할텐데, 죄송스럽게도 저희는 CAN 통신에 대한 실제 경험이 전혀 없어서 도움을 드리기 어렵습니다.
SPI 버스는 주로 단방향 출력인 그래픽 LCD 인터페이스 위주로만 사용해 보았습니다.

혹시 오실로스코프로 측정된 SPI CLK의 주파수를 알수 있을까요?
SPI clk는 10MHz입니다.
기본으로는 1.25MHz로 되어있었는데, 이를 수정하여 10MHz로 설정하였습니다.

원래는 소요시간이 더 길었으며,
10MHz 변경 시 overhead는 조금 줄어들었었습니다.

말씀드렸던 API 소요시간은 10MHz 기준입니다.

User avatar
odroid
Site Admin
Posts: 33336
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English
ODROIDs: ODROID
Has thanked: 384 times
Been thanked: 454 times
Contact:

Re: odroid c1+ 제품 kit, spi 통신 지연

Unread post by odroid » Tue Feb 04, 2020 11:44 am

그렇군요. ㅠㅠ

그렇다면 SPI 드라이버나 mcp251x 드라이버에서 필요이상으로 Chip-Select 핀의 assert 시간을 길게 잡고 있는 것은 아닌지 좀 의심스럽습니다.
https://community.nxp.com/thread/372623

또한 SPI IRQ handler를 사용빈도가 낮은 마지막 CPU Core #3로 할당해보는 것은 어떨까요?
cat /proc/interrupts 출력을 보여주시면 IRQ handler가 동작하는 CPU를 변경하는 방법을 찾아보겠습니다.

아래 스크립트는 ODROID-XU4에서 USB 3.0 IRQ handler 2개를 각각 다른 core에 할당하는 예제입니다.

Code: Select all

USB3_IRQ=`cat /proc/interrupts | grep "xhci-hcd:usb3" | awk -F : '{print $1}'`
USB5_IRQ=`cat /proc/interrupts | grep "xhci-hcd:usb5" | awk -F : '{print $1}'`
echo 5 > /proc/irq/${USB3_IRQ}/smp_affinity_list
echo 6 > /proc/irq/${USB5_IRQ}/smp_affinity_list

m.s.P
Posts: 25
Joined: Wed Nov 13, 2019 12:48 pm
languages_spoken: korean & english
ODROIDs: odroid c1+
Has thanked: 1 time
Been thanked: 0
Contact:

Re: odroid c1+ 제품 kit, spi 통신 지연

Unread post by m.s.P » Tue Feb 04, 2020 1:28 pm

odroid wrote:
Tue Feb 04, 2020 11:44 am
그렇군요. ㅠㅠ

그렇다면 SPI 드라이버나 mcp251x 드라이버에서 필요이상으로 Chip-Select 핀의 assert 시간을 길게 잡고 있는 것은 아닌지 좀 의심스럽습니다.
https://community.nxp.com/thread/372623

또한 SPI IRQ handler를 사용빈도가 낮은 마지막 CPU Core #3로 할당해보는 것은 어떨까요?
cat /proc/interrupts 출력을 보여주시면 IRQ handler가 동작하는 CPU를 변경하는 방법을 찾아보겠습니다.

아래 스크립트는 ODROID-XU4에서 USB 3.0 IRQ handler 2개를 각각 다른 core에 할당하는 예제입니다.

Code: Select all

USB3_IRQ=`cat /proc/interrupts | grep "xhci-hcd:usb3" | awk -F : '{print $1}'`
USB5_IRQ=`cat /proc/interrupts | grep "xhci-hcd:usb5" | awk -F : '{print $1}'`
echo 5 > /proc/irq/${USB3_IRQ}/smp_affinity_list
echo 6 > /proc/irq/${USB5_IRQ}/smp_affinity_list
감사합니다.

우선 확인 결과, chip select 신호 문제는 아닌 것 같습니다.

cat /proc/interrupt 출력은 다음과 같습니다.

그리고, 또한 여쭙고 싶은 것이 있는데,
아래 Interrupt 항목에서, MESON TIMER-F/G/H/I 및 USB 관련 Interrupt는 필수인 것인가요?
혹은 이외에도 아래 항목에서 죽여도 되는 항목이면, 최대한 필수 ISR만 살려놓고자 합니다.

Code: Select all

root@odroid:~# cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
 40:          0         441            0          0       GIC  eth0
 60:          2           0             0          0       GIC  sdio
 62:          0           0             0          0       GIC  dwc_otg, dwc_otg_hcd:usb2, dwc_otg_pcd
 63:          0           0             0     269192       GIC  dwc_otg, dwc_otg_hcd:usb1
 92:      26993        0             0          0       GIC  MESON TIMER-F
 93:          0       14087          0          0       GIC  MESON TIMER-G
 94:          0           0         15327       0       GIC  MESON TIMER-H
 95:          0           0             0       5770       GIC  MESON TIMER-I
 97:         12          0             0          0       GIC  mcp251x
107:          0          0             0          0       GIC  uart_b_ttyS2:
110:       2883        0             0          0       GIC  sdhc
122:        247         0            0          0       GIC  uart_ao_ttyS0:
192:          0          0             0          0       GIC  Mali_GP
193:          0          0             0          0       GIC  Mali_GP_MMU
194:          0          0            0           0       GIC  Mali_PP_Broadcast
196:          0          0            0           0       GIC  Mali_PP0
197:          0          0            0           0       GIC  Mali_PP0_MMU
198:          0          0            0           0       GIC  Mali_PP1
199:          0          0            0           0       GIC  Mali_PP1_MMU
IPI0:          0          0            0           0  CPU wakeup interrupts
IPI1:          0          0           0           0  Timer broadcast interrupts
IPI2:       2059     5683      1985       1188  Rescheduling interrupts
IPI3:          5          7           4            8  Function call interrupts
IPI4:         15         2          80          99  Single function call interrupts
IPI5:          0          0           0           0  CPU stop interrupts
IPI6:          0          0           0           0  CPU backtrace
Err:          0
감사합니다.

User avatar
odroid
Site Admin
Posts: 33336
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English
ODROIDs: ODROID
Has thanked: 384 times
Been thanked: 454 times
Contact:

Re: odroid c1+ 제품 kit, spi 통신 지연

Unread post by odroid » Tue Feb 04, 2020 3:17 pm

mcp251x driver의 IRQ 번호는 97로 확인 되었습니다.
아래와 같이 세번째 코어인 CPU 2번에 할당해 보시고, /proc/interrupt 내용을 확인바랍니다.

Code: Select all

echo 2 > /proc/irq/97/smp_affinity_list
각각의 타이머들과 USB IRQ는 어떤 부작용이 있을지 모르니 일단 변경없이 테스트 해봐 주시고, 여전히 불규칙하게 IRQ 처리시간이 늘어지는지 점검해 보시길 바랍니다.

m.s.P
Posts: 25
Joined: Wed Nov 13, 2019 12:48 pm
languages_spoken: korean & english
ODROIDs: odroid c1+
Has thanked: 1 time
Been thanked: 0
Contact:

Re: odroid c1+ 제품 kit, spi 통신 지연

Unread post by m.s.P » Tue Feb 04, 2020 3:30 pm

odroid wrote:
Tue Feb 04, 2020 3:17 pm
mcp251x driver의 IRQ 번호는 97로 확인 되었습니다.
아래와 같이 세번째 코어인 CPU 2번에 할당해 보시고, /proc/interrupt 내용을 확인바랍니다.

Code: Select all

echo 2 > /proc/irq/97/smp_affinity_list
각각의 타이머들과 USB IRQ는 어떤 부작용이 있을지 모르니 일단 변경없이 테스트 해봐 주시고, 여전히 불규칙하게 IRQ 처리시간이 늘어지는지 점검해 보시길 바랍니다.
네 알겠습니다. 감사합니다.

근데, 혹시 USB IRQ와 meson timer IRQ들은 어떤 용도인지, 무슨 동작을 하는 것인지 알 수 있을까요?

현재 사용하고 있는 USB 장치가 없어 USB IRQ를 죽이고 test 해보았는데, 확실치는 않지만 성능이 좀 더 좋아진 것 같습니다.

그리고 meson timer IRQ는 내부적으로 발생 간격이 서로 동일하게 되어있는데, 발생 count는 서로 다른 결과가 나오는 것 같습니다.

우선은 해당 IRQ들이 다른 IRQ에 비해 상대적으로 부하가 커서, 가능하다면 필히 고려가 필요할 것 같습니다.

감사합니다.

User avatar
odroid
Site Admin
Posts: 33336
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English
ODROIDs: ODROID
Has thanked: 384 times
Been thanked: 454 times
Contact:

Re: odroid c1+ 제품 kit, spi 통신 지연

Unread post by odroid » Tue Feb 04, 2020 4:18 pm

참, 현재 CPU governor 설정값이 performance mode가 맞는지도 봐주세요.
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

m.s.P
Posts: 25
Joined: Wed Nov 13, 2019 12:48 pm
languages_spoken: korean & english
ODROIDs: odroid c1+
Has thanked: 1 time
Been thanked: 0
Contact:

Re: odroid c1+ 제품 kit, spi 통신 지연

Unread post by m.s.P » Tue Feb 04, 2020 4:26 pm

odroid wrote:
Tue Feb 04, 2020 4:18 pm
참, 현재 CPU governor 설정값이 performance mode가 맞는지도 봐주세요.
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance mode는 맞습니다.

User avatar
odroid
Site Admin
Posts: 33336
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English
ODROIDs: ODROID
Has thanked: 384 times
Been thanked: 454 times
Contact:

Re: odroid c1+ 제품 kit, spi 통신 지연

Unread post by odroid » Tue Feb 04, 2020 4:31 pm

그렇군요.

usb1은 host 포트의 root hub IRQ 이며, usb0는 OTG 포트의 IRQ입니다.
타이머는 잘 모르겠습니다만, 일부는 동영상 가속기나 3D 가속기 드라이버 용도로 추측해 봅니다.

Post Reply

Return to “C0/C1/C1+/C2”

Who is online

Users browsing this forum: No registered users and 2 guests