- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先,我为我的 PIC 使用了 C18 编译器。当我创建像 high_ISR 这样的函数时没有任何调用,我的编译器会向它添加代码,我只能在反汇编 ListView 中看到这些代码。这使得我的 high_ISR 函数的循环时间为 160 个循环(但从 C 代码来看它似乎是空的)。
相反,如果我将它定义为一个宏,我将使它清空“ secret ”代码。我是否会以某种方式遇到其他函数的问题导致删除我的编译器 secret 放置在那里的代码,它会以其他方式解决这个问题吗?
我的意思是,我希望 ISR 更快。在 c 文件中编写函数时,有没有办法使 ISR 函数快速运行,我能否以某种方式抑制“ secret 代码”。
请参阅下面的代码示例:
在 .c 文件中正确创建我的 high_ISR 函数但周期时间长
#pragma interrupt highISR
void highISR(void)
{
SomeFunction();
}
例如在我的头文件中创建宏的函数(比如 16 个周期的周期时间)
#define FAST_INTERRUPT \
void highISR(void) \
{ \
SomeFunction(); \
}
澄清一下,如果我使用宏,我将其实现为:
#pragma interrupt higISR
FAST_INTERRUPT
第一个 highISR 声明产生了这个:
#pragma interrupt highISR
323: void highISR(void)
12B12 CFDA MOVFF 0xfda, 0xfe4
12B14 FFE4 NOP
12B16 CFE2 MOVFF 0xfe2, 0xfda
12B18 FFDA NOP
12B1A CFE9 MOVFF 0xfe9, 0xfe4
12B1C FFE4 NOP
12B1E CFEA MOVFF 0xfea, 0xfe4
12B20 FFE4 NOP
12B22 CFD9 MOVFF 0xfd9, 0xfe4
12B24 FFE4 NOP
12B26 CFDA MOVFF 0xfda, 0xfe4
12B28 FFE4 NOP
12B2A C1FB MOVFF 0x1fb, 0xfe4
12B2C FFE4 NOP
12B2E C1FC MOVFF 0x1fc, 0xfe4
12B30 FFE4 NOP
12B32 C1FD MOVFF 0x1fd, 0xfe4
12B34 FFE4 NOP
12B36 C1FE MOVFF 0x1fe, 0xfe4
12B38 FFE4 NOP
12B3A CFF6 MOVFF 0xff6, 0xfe4
12B3C FFE4 NOP
12B3E CFF7 MOVFF 0xff7, 0xfe4
12B40 FFE4 NOP
12B42 CFF8 MOVFF 0xff8, 0xfe4
12B44 FFE4 NOP
12B46 CFF5 MOVFF 0xff5, 0xfe4
12B48 FFE4 NOP
12B4A CFF3 MOVFF 0xff3, 0xfe4
12B4C FFE4 NOP
12B4E CFF4 MOVFF 0xff4, 0xfe4
12B50 FFE4 NOP
12B52 CFFA MOVFF 0xffa, 0xfe4
12B54 FFE4 NOP
12B56 CFFB MOVFF 0xffb, 0xfe4
12B58 FFE4 NOP
12B5A EE05 LFSR 0, 0x500
12B5C F000 NOP
12B5E 0E12 MOVLW 0x12
12B60 04E8 DECF 0xfe8, W, ACCESS
12B62 E303 BNC 0x12b6a
12B64 CFEE MOVFF 0xfee, 0xfe4
12B66 FFE4 NOP
12B68 D7FB BRA 0x12b60
12B6A 52E6 MOVF 0xfe6, F, ACCESS
324: {
325: SomeFunction();
12B6C EC48 CALL 0x14090, 0
12B6E F0A0 NOP
327: }
12B70 52E5 MOVF 0xfe5, F, ACCESS
12B72 EE05 LFSR 0, 0x511
12B74 F011 NOP
12B76 0E12 MOVLW 0x12
12B78 04E8 DECF 0xfe8, W, ACCESS
12B7A E303 BNC 0x12b82
12B7C CFE5 MOVFF 0xfe5, 0xfed
12B7E FFED NOP
12B80 D7FB BRA 0x12b78
12B82 CFE5 MOVFF 0xfe5, 0xffb
12B84 FFFB NOP
12B86 CFE5 MOVFF 0xfe5, 0xffa
12B88 FFFA NOP
12B8A CFE5 MOVFF 0xfe5, 0xff4
12B8C FFF4 NOP
12B8E CFE5 MOVFF 0xfe5, 0xff3
12B90 FFF3 NOP
12B92 CFE5 MOVFF 0xfe5, 0xff5
12B94 FFF5 NOP
12B96 CFE5 MOVFF 0xfe5, 0xff8
12B98 FFF8 NOP
12B9A CFE5 MOVFF 0xfe5, 0xff7
12B9C FFF7 NOP
12B9E CFE5 MOVFF 0xfe5, 0xff6
12BA0 FFF6 NOP
12BA2 CFE5 MOVFF 0xfe5, 0x1fe
12BA4 F1FE NOP
12BA6 CFE5 MOVFF 0xfe5, 0x1fd
12BA8 F1FD NOP
12BAA CFE5 MOVFF 0xfe5, 0x1fc
12BAC F1FC NOP
12BAE CFE5 MOVFF 0xfe5, 0x1fb
12BB0 F1FB NOP
12BB2 CFE5 MOVFF 0xfe5, 0xfda
12BB4 FFDA NOP
12BB6 CFE5 MOVFF 0xfe5, 0xfd9
12BB8 FFD9 NOP
12BBA CFE5 MOVFF 0xfe5, 0xfea
12BBC FFEA NOP
12BBE CFE5 MOVFF 0xfe5, 0xfe9
12BC0 FFE9 NOP
12BC2 CFE5 MOVFF 0xfe5, 0xfda
12BC4 FFDA NOP
12BC6 0011 RETFIE 0x1
第二个函数只产生这个 ->
322: #pragma interrupt highISR
323: FAST_INTERRUPT
13742 CFDA MOVFF 0xfda, 0xfe4
13744 FFE4 NOP
13746 CFE2 MOVFF 0xfe2, 0xfda
13748 FFDA NOP
1374A 52E6 MOVF 0xfe6, F, ACCESS
1374C 0105 MOVLB 0x5
1374E 5140 MOVF 0x40, W, BANKED
13750 1A77 XORWF 0xf77, F, ACCESS
13752 96A4 BCF 0xfa4, 0x3, ACCESS
13754 2877 INCF 0xf77, W, ACCESS
13756 6078 CPFSLT 0xf78, ACCESS
13758 86A4 BSF 0xfa4, 0x3, ACCESS
1375A 7E8B BTG 0xf8b, 0x7, ACCESS
1375C 0011 RETFIE 0x1
1375E 52E5 MOVF 0xfe5, F, ACCESS
13760 CFE5 MOVFF 0xfe5, 0xfda
13762 FFDA NOP
13764 0011 RETFIE 0x1
进一步说明只是为了表明它们自己的函数是相同的:对于第一个例程 ->
void SomeFunction(void)
{
if(PIR3bits.TMR4IF)
{
PIR3bits.TMR4IF = 0;
PR4 ^= _SoftPWM_Toggle;
_asm
INCF PR4,0,ACCESS
CPFSLT TMR4,ACCESS
_endasm
PIR3bits.TMR4IF = 1;
SOFT_PWM_PIN ^= 1;
}
}
标题中的第二个作为宏->
#define FAST_INTERRUPT \
void highISR(void) \
{ \
PR4 ^= _SoftPWM_Toggle; \
\
PIR3bits.TMR4IF = 0; \
\
_asm \
INCF PR4,0,ACCESS \
CPFSLT TMR4,ACCESS \
_endasm \
\
PIR3bits.TMR4IF = 1; \
\
SOFT_PWM_PIN ^= 1; \
\
_asm \
RETFIE 1 \
_endasm \
}
最佳答案
我不认为它在您的运行时是垃圾。请记住,中断可能发生在主线代码的任何位置。当您从中断中返回时,您会希望您的代码恢复到中断时的相同状态。编译器添加的代码是在 ISR 开始时保存该状态,然后在中断结束时恢复状态。如果它不这样做,并且您修改了主线代码正在使用的 ISR 中的寄存器或内存位置,那么当 ISR 返回时,代码不会按预期执行的可能性很大。通过消除编译器生成的代码,您已将责任移交给您的 ISR 以保存然后恢复主线代码的状态。如果你能保证你会没事的(一个空的 ISR 就是一个例子,它永远不会改变状态)。如果不能,当您从 ISR 返回主线代码时,将发生奇怪的代码执行。如果您使用的是高级编译语言,则很难知道它在幕后使用的是什么,因此让编译器为您生成状态保存代码 ISR 比尝试自己做更安全。
我建议您查看 MPLAB® C18 C 编译器用户指南文档。 #pragma interupt 指令有额外的参数,允许您自定义保存哪些状态信息。
关于c - 在宏 C 内部或外部定义函数(高中断),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8893488/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!