2012-09-25 37 views
5

Tôi có thói quen bật/tắt pin GPIO cao/thấp và có độ trễ giữa mức cao và thấp (sử dụng udelay) và sau đó lấy mẫu GPIO nhà nước trong một thời gian. Tôi cần phải đảm bảo rằng một phần của mã này được thực hiện mà không bị người lập lịch hoặc bị ngắt trước. Tôi đang chạy mã trên một hệ thống ARM lõi kép nên nó phải là SMP. Có phải Spin_Lock_IrqSave() đủ an toàn cho mục đích đó không? Tôi có một cảm giác mã của tôi vẫn còn bị gián đoạn đôi khi nhưng không có bằng chứng nào được nêu ra.Trong linux, cách đảm bảo chuỗi mã được thực hiện mà không bị gián đoạn

Thanks a lot.

Trả lời

4

Nếu bạn muốn vô hiệu hóa việc sử dụng trước, hãy sử dụng preempt_disable()preempt_enable(). Nếu bạn muốn vô hiệu hóa ngắt, sử dụng local_irq_disable()

spin_lock_irqsave sẽ thường làm cả hai, mặc dù một số "thời gian thực" cải tiến đôi khi cho phép spinlocks lịch trình, vì vậy nó luôn luôn là tốt nhất để nói những gì bạn muốn nói.

+0

Cảm ơn bạn rất nhiều vì đã trả lời. Tôi muốn vô hiệu hóa cả hai ngắt và preemption, và đảm bảo một trong những thói quen của tôi có thể được thực hiện mà không có bất kỳ sự gián đoạn. Các thói quen cần phải gọi trình điều khiển GPIO (gpio_set/reset_value, gpio_direction_input/đầu ra) và cũng có chức năng udelay. Trong trường hợp này, spin_lock_irqsave có đủ an toàn không? Cảm ơn một lần nữa – user1697356

Các vấn đề liên quan