Skip to content

hoangnguyen123cp5-glitch/VHT_Test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sensor Project — Embedded Linux Assignment

1. Build & Run

Kernel module

cd kernel
make
sudo insmod sensor_driver.ko
ls -l /dev/sensor0        # crw-r--r-- (0644)
cat /dev/sensor0          # vd: 0:3650:123456789

Gỡ module

sudo rmmod sensor_driver

Userspace (Phần 2 — đang phát triển)

cd userspace && make
(ghi rõ trạng thái hiện tại ở mục Known Limitations)

2. Design Decisions

Spinlock riêng từng sensor (không dùng lock toàn cục)

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.

Per-file context (file->private_data)

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.

hrtimer + ring buffer per-sensor

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.

container_of trong timer callback

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 2 — điền khi làm): lock ring buffer userspace,

pause/resume không pthread_cancel, shutdown sequence

3. Known Limitations

  • 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.

4. Testing

Cách chạy

./scripts/test_basic.sh

Kết quả Phần 1 (đã verify trên Ubuntu 22.04 / kernel 5.15)

  • 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)

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors