Đo tải cpu của thói quen ngắt


8

Tôi có một isr đang cập nhật màn hình ở tần số cố định. Tôi muốn điều chỉnh thói quen của mình để giảm thiểu chi phí hoạt động và giữ càng nhiều thời gian cpu càng tốt để xử lý khác, nhưng tôi không có cách nào tốt để thu thập số liệu để xác định tải cpu của mình.

Tôi có thể nhìn vào hội đồng và phân tích thói quen, nhưng tôi không đủ kiên nhẫn hoặc khả năng để làm điều đó một cách chính xác. Tôi cũng không cảm thấy mình cần kết quả cực kỳ tốt, chỉ là một tỷ lệ phần trăm đơn giản của thời gian cpu bị chiếm dụng.

Tôi chỉ có thể đặt pin ở mức cao khi isr đang hoạt động và đo bên ngoài. Điều đó có tối thiểu chi phí trong mã, nhưng tôi không biết nên đo nó với cái gì. Tôi không có máy hiện sóng hay bất cứ thứ gì tương tự. Có một ic đơn giản hoặc một cách dễ dàng để sử dụng một vi mô khác để đo chu kỳ nhiệm vụ? Tôi đã nghe nói về các chip đếm tần số chuyên dụng, nhưng có bất cứ điều gì cho chu kỳ nhiệm vụ không?

Câu trả lời:


8

Chỉ cần một ý tưởng nửa vời, bạn có thể sử dụng bộ tính giờ như vậy (mã giả):

int main(void)
{

    /* ... init timers and uart here, enable your interrupts ... */

    start_timer0();
    while (!timer1Started()){}
    stop_timer1();

    uart_puts("Idle ticks: %d, ISR ticks: %d", timer0_value, timer1_value);

}

và trong màn hình của bạn ISR ...

ISR_display()
{
    stop_timer0();
    start_timer1();

    /* ... your ISR routine ... */
}

Tôi đã đưa ra một vài giả định ở đây. 1 - rằng bạn không sử dụng bộ hẹn giờ của mình cho bất cứ điều gì khác, và rằng - 2 - chi phí bắt đầu và dừng bộ hẹn giờ là tối thiểu (thường được thực hiện với một lần ghi đăng ký). EDIT: và giả định thứ 3, bạn có thể nắm bắt tất cả những điều này trước khi xảy ra tràn bộ đếm thời gian, nhưng có lẽ bạn cũng có thể tính đến điều đó.

Sẽ có một số chi phí chuyển đổi ngữ cảnh mà bạn sẽ không thể nắm bắt được và điều này cũng bổ sung thêm hai thao tác trong ISR của bạn (hãy chắc chắn sử dụng macro cho start_timer / stop_timer của bạn để loại bỏ phí gọi chức năng). Nếu bạn có thể nhận được tổng số chu kỳ được sử dụng cho macro bắt đầu + dừng bộ đếm thời gian, thì bạn có thể trừ các dấu kiểm đó khỏi timer1_value để lấy giá trị của dấu ISR chính xác hơn một chút. Tính toán cuối cùng của bạn cho% thời gian CPU được sử dụng sẽ chỉ là:

Usagecpu=(TicksisrTicksisr+Ticksidle)100

1
+1 cho một giải pháp không yêu cầu phần cứng bên ngoài. Có lẽ là một cách rườm rà hơn để làm điều đó, nhưng nó phù hợp với những hạn chế của tôi. Tôi chỉ cần tìm hiểu về bộ tính giờ. Cảm ơn.
captncraig

Tôi đã sử dụng điều này trên một AVR cho một dự án tương tự. Nó hoạt động rất tốt.
drxzcl

11

Đặt ghim đầu ra khi bạn nhập ISR và xóa nó trước khi quay trở lại. Lọc đầu ra với bộ lọc RC. Điện áp trên tụ sẽ cung cấp cho bạn chu kỳ nhiệm vụ ISR.
Chẳng hạn, nếu nguồn điện của bạn là 3,3V và bạn đo được 33mV, thì bạn dành 1% thời gian cho ISR.


2
Đây chính xác là những gì chúng tôi làm, ngoại trừ phần bộ lọc RC. Chúng tôi đặt chân đầu ra khi vào ISR, sau đó xóa nó khi trở về. Nhìn vào điều này trên một phạm vi o sẽ cung cấp tất cả các loại thông tin hữu ích.

3
@David - Tôi cũng chỉ xem các xung trên một phạm vi, nhưng OP nói rằng anh ấy không có.
stevenvh

1
Có vẻ như tôi cần bắt đầu tiết kiệm cho một phạm vi tốt.
captncraig

@stevenvh, chính xác những gì tôi sẽ đề xuất khi tôi thấy sự vắng mặt của một phạm vi. Đây là lý do tại sao những kẻ nhúng yêu thích một số chân ra kỹ thuật số thêm.
Kortuk

Lọc để đo mà không có một phạm vi một ý tưởng tốt đẹp. Bật / tắt đèn LED và đo độ sáng hiệu quả: -). (Rất khó để nhìn thấy các biến thể khá lớn - nhưng dễ thương.)
Russell McMahon

7

Cách dễ nhất để làm điều này là chạy mã trong trình giả lập và đo các chu kỳ được thực hiện bởi thói quen ngắt. Ví dụ, trình giả lập MicroLip MPLAB có tính năng bấm giờ tiện dụng rất hữu ích cho mục đích này.

Không, việc tăng mã pin khi bắt đầu ngắt và hạ thấp nó ở cuối có thể giúp ích. Cách dễ nhất để xem xét đó là với máy hiện sóng. Nếu bạn đang làm các dự án vi điều khiển và điện tử, bạn vẫn nên lấy một cái.

Nếu không có phạm vi, bạn chỉ có thể lọc thông thấp điện áp pin, sau đó đo bằng vôn kế. Điện áp đó chia cho điện áp nguồn của bộ xử lý sẽ cho bạn một phần nhỏ thời gian pin cao. Ví dụ: nếu bộ xử lý đang chạy trên 3,3V và điện áp chân được lọc thông thấp là 800mV, thì pin cao 800mV / 3,3V = 24% thời gian.

Vì rõ ràng bạn đang sử dụng một trình biên dịch, bạn cần phải loại bỏ câu trả lời này. Trình biên dịch có khả năng thêm một số mã nhập ngắt trước khi mã của bạn chạy và ngắt mã thoát sau khi mã của bạn chạy. Thời gian ngắt thực sự sẽ kéo dài một vài chu kỳ ở hai bên của xung. Tất nhiên, nếu bạn quan tâm đến thời gian gián đoạn, bạn không nên sử dụng trình biên dịch ở vị trí đầu tiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.