Core BSP 분석 (119) 썸네일형 리스트형 [라즈베리파이] 비트 처리 __test_and_set_bit() __test_and_clear_bit() 함수 동작 원리 리눅스 커널과 드라이버에서 __test_and_set_bit()와 __test_and_clear_bit() 함수를 많이 씁니다. 두 함수 중 test_and_set_bit()를 써서 비트를 처리하는 코드를 보겠습니다. 다음은 워크를 워크큐에 큐잉하는 queue_work_on() 함수입니다. [kernel/workqueue.c] 1 bool queue_work_on(int cpu, struct workqueue_struct *wq, 2 struct work_struct *work) 3 { 4 bool ret = false; 5 unsigned long flags; 6 7 local_irq_save(flags); 8 9 if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, wo.. [리눅스] printk 아규먼트 포멧 printk에 %로 어떤 형식을 지정할 지 헷갈릴 때가 많습니다. 이럴 때는 다음 형식을 참고하면 됩니다. If variable is of Type, use printk format specifier: ------------------------------------------------------------ int %d or %x unsigned int %u or %x long %ld or %lx unsigned long %lu or %lx long long %lld or %llx unsigned long long %llu or %llx size_t %zu or %zx ssize_t %zd or %zx s32 %d or %x u32 %u or %x s64 %lld or %llx u64 %llu or %.. [C언어] 포인터 (p + 1) 연산 포인터의 기본 문법에 대해서 조금 더 알아볼게요. 코드는 다음과 같습니다. int i = 10; int *p = &i; *p = 20; 이 때 64 비트 CPU 기반으로 메모리 구조를 한번 그려볼까요? 1008번지에는 i란 지역변수가 있고 1000 번지에는 p란 포인터 타입 지역 변수가 위치해 있죠. 포인터 주소 값 | 1000 |--- 1008 | | p | 1008 |--- (10 -> 20) i 변수 i의 위치가 1008번지라면 포인터 변수 p에는 i 변수 주소를 대입했으므로 p는 int을 가르키는 주소가 됩니다. 이 때 주소 변수를 선언하는 방법은 int *p입니다. 그런데 컴파일러는 이 선언부를 다음과 같이 해석합니다. pointer to int 주소 변수를 가르키는 대상체의 타입이 중요하므로 .. [Linux][GCC]## 매크로 - 심볼 생성 리눅스 커널 코드를 읽다 보면 C 코드에는 존재하지 않는 함수를 호출하는 경우가 있습니다. 희한하게도 해당 함수를 아무리 검색해도 찾을 수 없는데 다른 함수에서 아무 문제 없이 호출합니다. 자 그럼 한 가지 예를 들게요. 아래 코드를 보면 end_page_writeback 함수에서 PageReclaim와 ClearPageReclaim 함수를 호출합니다. 이 함수는 페이지 write back 동작을 멈추는 역할을 하는 것으로 보이네요. [mm/filemap.c] void end_page_writeback(struct page *page) { if (PageReclaim(page)) { ClearPageReclaim(page); rotate_reclaimable_page(page); } PageReclaim.. [Linux] 컴파일러(Complier) 소개 소프트웨어에 입문하는 분들은 컴파일러란 단어를 매우 자주 들을 가능성이 높습니다. 왜냐면 현업에서 가장 많이 쓰는 단어 중 하나이거든요. 그럼 컴파일이란 단어를 영한 사전으로 찾으면 "안내서를 만들다.", "책을 편집하다."란 의미입니다. 그러면 "컴퓨터에게 편집해서 안내서를 만든다"란 문장으로 컴파일이란 단어를 조합할 수 있는 것 같습니다. x86, ARM과 같은 CPU가 해석할 수 있는 것은 오로지 명령어이며, 이는 비트 패턴인 기계어를 뜻합니다. "프로세스는 이미 정해진 특정한 비트 패턴에 반응한다"란 의미로 특정 비트 패턴을 명령어라고 부를 수 있습니다. 조금 쉽게 설명을 드리면 CPU는 여러가지 전기적 스위치로 구성돼 있으며, 어떤 특정한 전기 스위치를 작동시키려면 데이터 버스 선을 따라 전압이.. GCC - C언어 매크로(Macro) -(1) C Macro를 잘 알아두면 편리합니다. Register 설정을 Macro로 관리하면 엄청 편하거든요. 주소를 다 외울 수는 없으니까요. 그리고 일단은 Macro도 argument를 받을 수 있어요. 이런 Macro를 선언해서 쓰는 방법도 여러 가지가 있습니다. Macro는 자주 쓰이는 코드 묶음을 한 개로 쓸 수 있다는 장점이 있어요. 예를 들어서 코드를 짜다 보니까, critical_section_in(); ret = io_read (); critical_section_out(); 이라는 부분이 반복되면 계속 위 코드를 입력하기 귀찮겠죠? 이 코드들을 아름답게 하나의 Macro로 만들 수 있습니다. 그러면 #define으로 CRITICAL_IO_IN() 을 선언하는데, 반복되는 부분을 역슬래쉬 "\".. LKML - [PATCH v2] clk: fix reentrancy of clk_enable() on UP systems 최근 시스템이 복잡해져서 대부분의 시스템은 SMP를 적용한다고 생각하지만 안정성을 가장 중요하게 보는 자동차 시스템은 하나의 CPU만 적용해요. 이런 UP 시스템에서, spin_trylock_irqsave() API를 쓰게 되면 무조건 return true를 수행하게 됩니다. 무엇보다 중요한 점은 얼마만큼 시간 차이가 있는지 출력하죠. diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 83c8df7..5add75b 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -143,10 +143,18 @@ static unsigned long clk_enable_lock(void) { unsigned long.. 와치독 Watchdog Kick 동작 비교 (Qualcomm vs Intel vs Mediatek vs nVidia) 커널 이슈를 접하면 자연스럽게 와치독 리셋 문제를 만납니다. 많은 커널 개발자들이 디버깅하기 어려운 문제 중 하나가와치독 리셋이라고 말합니다. 하지만 각 SoC 시스템에서 와치독 구현 원리를 정확히 파악하면 디버깅이 커널 패닉보다 오히려 쉬운 경우가 많습니다. 이제 각각 SoC별로 와치독 동작에 대해 간단히 비교 리뷰를 해볼께요. Qualcomm - MSM msm_watchdog이라는 커널 쓰레드가 와치독 동작을 담당합니다. 이 커널 쓰레드는 부팅 과정에서 생성된 후 10초 간격으로 실행됩니다. 10초 후 msm_watchdog 쓰레드가 실행 되면 1> 현재 핫플러그인 되지 않은 active 한 CPU에 IPI(Interprocess Interrupt: CPU간 통신을 위해 인터럽트 인터페이스 지원) 콜.. 이전 1 ··· 7 8 9 10 11 12 13 ··· 15 다음