0

割り込みをアクティブにせずに、割り込みの動作を模倣することは可能ですか?

私が尋ねる理由は、私が使用しているマイクロコントローラーは、常に1つの割り込みしかアクティブにできないためです。タイムトリガーシステムを作成しているので、タイマー用に割り込みが設定されています。

基本的に、関数が定期的にデプロイされるように、TTシステム(時間トリガー)を作成する必要があります。私はデータロギングシステムを作成しているので、文字はUARTから入力され、保存および記録されます。シリアルポートの割り込みが必要です。これは、ユーザーからキャラクターが入ってくるときに発生します。したがって、タイマー用とシリアルポート用の2つの割り込みを持つシステムを設計する必要があります。ただし、コントローラは2つの割り込みを同時にアクティブにすることを許可しません。

これが混乱している場合は本当に申し訳ありません。データシートへのリンクをコントローラーに投稿しました。これがインターフェースのコードです。

void Menu_Update(void)
{
    uint8_t x=010;
    char i;
    i= (char)x;
    // Perform an appropriate action based on the current state.
    //Disable_Interrupt();
    //Enable_System_Interrupt(UART1);
    timer_count++;
    switch (menu_state)
    {
    case MAIN_MENU :
        // Output the initial menu choices and move to the wait state.
        Serial_UART_Write_String("Waiting for character input.......\r\n");
        Serial_UART_Write_String("To view data, enter 'a' \r\n");
        menu_state = MENU_WAIT ;
        break;
    case MENU_2:
        Serial_UART_Write_String("\r\nWould you also like to store this character as well?\r\n");
        Serial_UART_Write_String("Yes Enter 'y' \r\n");
        Serial_UART_Write_String("No Enter 'n' \r\n");
        menu_state = MENU_WAIT ;
        break;
    case MENU_WAIT :
        // Do nothing unless user input was detected.
    default:
        if (Serial_UART_Received_Data())
        {
            const char value = Serial_UART_Read();
            temp = value;
            Serial_UART_Write_String("\r\n***Character: ");
            Serial_UART_Write_Char(value);
            Serial_UART_Write_String(" has been received***\r\n");
            if (value == 'a'||menu_check==1)
            {
                menu_check =1;
                if (value == 'y')
                {
                    menu_check =0;
                    menu_state = WRITE_CHAR;
                }
                if (value == 'n')
                {
                    Serial_UART_Write_String("\r\nSegment format -> ");
                    Serial_UART_Write_String("Character count.Time\r\n");
                    menu_check =0;
                    menu_state = DISPLAY;
                }
                if (menu_check==1)
                {
                menu_state = MENU_2;
                }
            }
            else
            {
                menu_state = WRITE_CHAR;
            }
        }
        break;
    case WRITE_CHAR:
        character_array_storage[character_count]=temp;
        charac_time = timer_count - ref_timer;
        timer_interval_array[character_count]=charac_time;
        character_count++;
        Serial_UART_Write_String("\r\n***Character Stored***\r\n");
        menu_state = MAIN_MENU;
        break;
    case DISPLAY:
        assign_value(character_count,charac_time);
        Serial_UART_Write_String("\r\n***Segments Updated***\r\n");
        menu_state = MAIN_MENU;
        break;
    }
    //Disable_Interrupt();
    //Enable_System_Interrupt(TIMER0);
}
void Enable_System_Interrupt(const uint32_t int_source)
{
    Status_Reg_Set((Status_Reg_Get()& 0xFFFFF8FF) | (int_source << 8));
}
void Status_Reg_Set(uint32_t value)
{
    __asm volatile("mtc0 %0, $12" :: "d" ((unsigned long)(value)));

}

データセット ありがとうございます

4

1 に答える 1

2

マイクロプロセッサのアセンブラを十分に理解している場合は、これを行うことができます。ドキュメントを確認してください。ただし、CPU の 90% では、割り込みハンドラを呼び出す前に現在のステータス ワードをスタックにプッシュするだけで十分です。この場合、そのiret命令を使用して正常に戻ります。

1 日の終わりに、割り込みハンドラは同じ関数ですが、より多くのレジスタを保持し、最後iretに通常の代わりに実行する点が異なりretます。

于 2012-10-15T10:25:37.817 に答える