gpt4 book ai didi

制造商的 C 代码中断设置

转载 作者:行者123 更新时间:2023-11-30 21:35:09 24 4
gpt4 key购买 nike

下面的代码片段来自制造商。我对他们想做什么感到完全困惑。特别是与 InterruptHandler 有关的任何事情。

请对全局部分中的代码进行评论。这看起来合适吗?

此外,其中包含的各种 API 对我来说都有症结所在。他们是否尝试使用 void 指针? ...有很多问题要问,请主要评论他们建议timer2如何工作。

...

/**
Section: Global Variables Definitions
*/

void (*TMR2_InterruptHandler)(void);

...

/**
Section: TMR2 APIs
*/

void TMR2_Initialize(void)
{
// Set TMR2 to the options selected in the User Interface

// T2CKPS 1:2; T2OUTPS 1:2; TMR2ON off;
T2CON = 0x11;

// T2CS LFINTOSC;
T2CLKCON = 0x04;

// T2PSYNC Not Synchronized; T2MODE Software control One shot; T2CKPOL Rising Edge; T2CKSYNC Not Synchronized;
T2HLT = 0x08;

// T2RSEL TMR4_postscaled;
T2RST = 0x02;

// PR2 8;
T2PR = 0x08;

// TMR2 0;
T2TMR = 0x00;

// Clearing IF flag before enabling the interrupt.
PIR4bits.TMR2IF = 0;

// Enabling TMR2 interrupt.
PIE4bits.TMR2IE = 1;

// Set Default Interrupt Handler
TMR2_SetInterruptHandler(TMR2_DefaultInterruptHandler);

// Start TMR2
TMR2_Start();
}

void TMR2_ISR(void)
{

// clear the TMR2 interrupt flag
PIR4bits.TMR2IF = 0;

if(TMR2_InterruptHandler)
{
TMR2_InterruptHandler();
}
}


void TMR2_SetInterruptHandler(void* InterruptHandler)
{
TMR2_InterruptHandler = InterruptHandler;
}

void TMR2_DefaultInterruptHandler(void)
{
// add your TMR2 interrupt custom code
// or set custom function using TMR2_SetInterruptHandler()
}

/**
End of File
*/

谢谢,史蒂夫

编辑:制造商代码包含一个例程(我似乎无法在此处添加它),用于管理调用 TMR2_ISR if (PIE4bits.TMR2IE == 1 && PIR4bits.TMR2IF == 1) 的高级中断,这似乎否定了任何 TMR2_DefaultInterruptHandler 会不是吗?

再次感谢您的帮助。

最佳答案

加尔·戈弗雷 (Garr Godfrey) 和马丁·詹姆斯 (Martin James) 的评论提供了有用的提示。因此,我将尽力填补可能的空白:

  1. void (*TMR2_InterruptHandler)(void); 是一个全局变量,带有提供当前中断处理程序的函数指针。

  2. 我会将 TMR2_ISR() 读作“中断服务例程”。从提供的代码来看,尚不清楚它是从哪里调用的。从它的名字来看,可以合理地假设它是在中断被触发时被调用的。它检查全局中断处理函数指针TMR2_InterruptHandler是否不为NULL,如果成功则调用指向的函数。

  3. 如果TMR2_Initialize()之前已被调用,则TMR2_InterruptHandler指向函数TMR2_DefaultInterruptHandler()。因此,在本例中,后者是从 TMR2_ISR() 调用的。

  4. void TMR2_SetInterruptHandler(void* InterruptHandler) 用于TMR2_Initialize()。它设置当前的中断处理程序。 (惊喜。)
    我有点困惑,因为我会成功:
    void TMR2_SetInterruptHandler(void (*InterruptHandler)())
    这是因为我日常使用 C++ 的工作训练了我“干净的打字”,但我记得 C 在这方面要宽松得多。 (void* 与任何指针兼容。)

  5. 正如 Garr Godfrey 所说:“将代码放入 TMR2_DefaultInterruptHandler”
    哪里有评论推荐
    //添加您的 TMR2 中断自定义代码

关于制造商的 C 代码中断设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45251386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com