[HW 공지] 질문에 대한 답변2

2018.04.09 09:14

조교 조회 수:960

질문 : 보드로 테스트를 돌리는데 첫 실행때는 아무 문제 없이 수행이 잘되다가
ctrl+c 로 종료 후 다시 수행시키면 open이 안됩니다.(반환값이 -1입니다)
--------------------------------------------------------------------------------------------------------------------
컨트롤 c로 종료해서 생기는 문제입니다.
디바이스 드라이버는 실행파일로 밖에 드리지 않았지만, 각 디바이스 드라이버는 내부적으로 해당 디바이스 드라이버를 몇 개의 프로세스가 현재 사용하고 있는지를 count합니다.
즉, 한 process가 open할 떄 device driver 내부의 count변수가 증가하고, close할 때 count 변수가 감소합니다.
그런데, 현재의 device driver들은 여러개의 프로세스가 하나의 device driver를 동시에 사용할 수 없도록 구현되어 있습니다.
예를 들어, led device driver 내부에 usage라는 변수가 존재하고, 처음에는 0이었다가,
한 process가 open을 하면 led device driver의 usage 변수값은 1이 됩니다.
이 후 이 prcoess가 led device driver를 사용하다, 사용이 끝난 후 close를 하면 usage 변수값은 다시 0이 되는 거죠.
만약, 이 prcoess가 사용하고 있는 중에, 다른 process가 open을 하여 사용할려고 시도할 경우,
해당 변수값이 0이 아니기에 사용할 수 없다고 -1을 반환하는 것입니다.

즉, ctrl+c는 프로그램을 중간에 강제로 종료시키는 것이기에 close를 하지 못해 usage 변수값을 감소시키지 못했고,
따라서 다시 open을 시도할 경우, 여전히 device driver는 usage 변수값이 1이여서
새로운 process의 접근을 거부한 것입니다.

따라서 테스트 시, 계속 보드를 재부팅시키시는 것이 불편하시다면
테스트 프로그램을 ctrl+c로 종료하는 것이 아니라, 일정 시간이 지난 후 close를 호출한 뒤 종료시키거나, 또는 특정 버튼을 누르면 close를 호출한 뒤 종료하는 것으로 변경한 뒤 테스트하세요.
또는 device driver를 rmmod했다가 다시 insmod해서 device driver를 초기화 시키는 식의 방법을 사용해도 될 거 같습니다.
-------------------------------------------------
과제 프로그램의 경우에는, 특정 버튼을 누르면 종료하는 것이므로, 종료시 Close를 다 호출한 후 종료하게 구현하면
다시 실행해도 문제가 없을 겁니다.
XE Login