2014-04-15 15 views
7

Sử dụng hai USART chạy ở 115200 baud trên STM32F2, một để giao tiếp với mô-đun radio và một cho nối tiếp từ PC. Tốc độ đồng hồ là 120MHz.Lỗi quá mức với hai ngắt USART

Khi nhận dữ liệu từ cả hai lỗi vượt quá USART cùng lúc có thể xảy ra trên một USART hoặc lỗi khác. Làm một số nhanh chóng trở lại của các tính toán phong bì có đủ thời gian để xử lý cả hai, như các ngắt chỉ đơn giản là sao chép byte vào một bộ đệm tròn.

Trong cả hai lý thuyết và từ đo mã ngắt để đẩy byte để đệm nên/không chạy theo thứ tự của 2-4μS, tại 115200 baud chúng tôi có khoảng 70us để xử lý mỗi char.

Tại sao chúng ta thấy các ORE không thường xuyên trên một hoặc USART khác?

Update - thêm thông tin:

  1. Không ISRs khác trong mã của chúng tôi được bắn vào lúc này.
  2. Chúng tôi đang chạy Keil RTX với ngắt gián đoạn được định cấu hình để kích hoạt mỗi 10mS.
  3. Hiện tại, chúng tôi không vô hiệu hóa bất kỳ gián đoạn nào.
  4. Theo cuốn sách này (của nhà thiết kế Guide to the Cortex-M Processor Family) độ trễ gián đoạn là khoảng 12cycles (không thực sự nguy hiểm)

Với tất cả các 70us trên là ít nhất gấp 10 lần so với thời gian chúng tôi thực hiện để xóa các gián đoạn - vì vậy tôi không chắc nó là dễ dàng như vậy để giải thích. Tôi có nên kết luận rằng phải có một số yếu tố khác tôi đang tìm kiếm?

MDK-ARM là phiên bản 4.70

Các systick ngắt được sử dụng bởi các RTOS do đó có thể không phải thời gian này các ISRs khác mất 2-3μS để chạy mỗi byte mỗi.

+1

Bạn chưa cung cấp đủ thông tin để ai đó nói lý do tại sao bạn, đặc biệt, đang bị lạm dụng. Các ứng cử viên rõ ràng: Vô hiệu hóa ngắt ở một nơi khác? Bộ xử lý ngắt ưu tiên cao hơn quá chậm? Lỗi trong mã của bạn? Không đủ thông tin để tìm ra cái nào. – janm

+0

Độ trễ ISR là khá chết người trên chip đó, các UART không có bộ đệm nămo. Tính toán lý thuyết của bạn đã được tắt bởi một yếu tố của hai. Thêm các ngắt ưu tiên cao hơn có ISR mất quá nhiều thời gian hoặc ngắt kết nối bị vô hiệu hóa trong mã mà bạn không biết và việc tràn ngập sẽ dễ giải thích. –

+0

Cảm ơn các ý kiến ​​tôi đã thêm một số thông tin cho câu hỏi, tôi không chắc chắn những thông tin khác tôi có thể cung cấp. –

Trả lời

1

Tôi đã gặp phải sự cố tương tự như của bạn vài tháng trước trên Cortex M4 (SAM4S). Tôi có một chức năng được gọi là ở 100 Hz dựa trên một ngắt Timer.

Trong thời gian chờ đợi, tôi đã định cấu hình UART để làm gián đoạn việc tiếp nhận char. Dữ liệu dự kiến ​​trên UART là các gói dài 64 byte và gián đoạn trên mọi độ trễ gây ra bởi vì chức năng cập nhật 100 Hz của tôi đang chạy ở khoảng 20 Hz. 100 Hz là tương đối chậm trên bộ vi xử lý 120 MHz đặc biệt này nhưng gián đoạn trên mỗi char gây ra sự chậm trễ lớn.

Tôi quyết định định cấu hình UART để sử dụng PDC (bộ điều khiển DMA ngoại biên) và các sự cố của tôi đã biến mất ngay lập tức.

DMA cho phép UART lưu trữ dữ liệu trong bộ nhớ KHÔNG ngắt bộ xử lý cho đến khi bộ đệm tiết kiệm được rất nhiều chi phí.

Trong trường hợp của tôi, tôi đã yêu cầu PDC lưu trữ dữ liệu UART vào bộ đệm (mảng byte) và chỉ định độ dài. Khi UART thông qua PDC chứa đầy bộ đệm, PDC đã phát hành gián đoạn.

Trong PDC ISR:

  1. Cho PDC mới đệm trống
  2. Restart UART PDC (như vậy có thể thu thập dữ liệu trong khi chúng tôi làm công cụ khác trong ISR)
  3. memcpy đệm đầy đủ vào RINGBUFFER
  4. Thoát ISR

Như đã đề xuất ở trên, hãy triển khai DMA và bạn sẽ yêu cuộc sống.

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