cd kernel
make
sudo insmod sensor_driver.ko
ls -l /dev/sensor0 # crw-r--r-- (0644)
cat /dev/sensor0 # vd: 0:3650:123456789
sudo rmmod sensor_driver
cd userspace && make
(ghi rõ trạng thái hiện tại ở mục Known Limitations)
Mỗi sensor có 1 hrtimer chạy theo sampling_rate riêng. Lock chung sẽ khiến timer sensor này phải chờ thao tác của sensor khác nhả lock → trễ → sai chu kỳ lấy mẫu. Lock riêng cho 3 sensor chạy độc lập. Tương tự 3 ngoại vi SPI/timer độc lập trên MCU, mỗi cái FIFO và clock riêng, không tranh bus.
Chỉ 1 device node /dev/sensor0 nhưng nhiều tiến trình cần làm việc với sensor khác nhau cùng lúc. Mỗi open() cấp 1 context (kzalloc) lưu sensor đang chọn cho fd đó. Giống địa chỉ slave trên bus: 1 đường truyền vật lý, phân biệt phiên làm việc bằng định danh riêng.
Mỗi sensor là 1 timer auto-reload (giống TIM trên STM32 với ARR): mỗi lần tràn, callback sinh 1 mẫu và đẩy vào FIFO 8 entry của sensor đó. read()/SENSOR_READ_SAMPLE tiêu thụ từ FIFO này. Khi FIFO đầy mà userspace đọc chậm: ghi đè mẫu cũ nhất + tăng error_count — chính là cơ chế cờ ORE (Overrun) của FIFO UART, nhưng đếm được số lần mất.
Callback chỉ nhận con trỏ tới hrtimer. Dùng container_of để suy ngược ra struct sensor_state chứa nó → biết đang phục vụ sensor nào. Tương tự 3 nguồn ngắt chung 1 ISR phải đọc status register để biết nguồn nào kích hoạt.
- Phần 1 (kernel module): hoàn thành đầy đủ theo đề, test pass.
- Phần 2 (daemon): mới có khung parse tham số (-d/-l/-s/-i/-v). Chưa làm: reader threads, writer, ring buffer userspace, IPC Unix socket, signal handling, log rotation, pause/resume. Đã có thiết kế: 3 reader + 1 writer dùng chung ring buffer.
- Phần 3 (CLI sensor_ctl): chưa bắt đầu.
./scripts/test_basic.sh
- 3 sensor random đúng range qua read() text và READ_SAMPLE binary
- Timestamp các mẫu cách đúng theo sampling_rate (hrtimer chính xác)
- SET_RATE: chấp nhận 1-100Hz, từ chối ngoài khoảng; đổi rate làm thay đổi tốc độ tích mẫu thực tế của sensor
- FIFO tràn khi không đọc: error_count tăng đúng (overrun)
- GET_STATS khớp số lần đọc, RESET đưa counter + FIFO về 0
- Concurrent: nhiều tiến trình mở /dev/sensor0, chọn sensor khác nhau, đọc độc lập không ảnh hưởng (per-file context)