完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好。
我遇到了一个问题:每当我在ISR中设置一个全局变量时,它在ISR结束后设置为0! volatile int test; void main(void) { TIM1_DeInit(); TIM1_TimeBaseInit(10,TIM1_COUNTERMODE_UP,20000,0); TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE); TIM1_Cmd(ENABLE); /* 无限循环 */ enableInterrupts(); 而(1) { test = test; } } INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler,11) { test = 1; } 在ISR中测试总是1,但在主要测试中始终为0 ??为什么? 提前谢谢 |
|
相关推荐
6个回答
|
|
我很确定还有另外一个代码,除了你在这里发布的代码......
无论如何,我建议你在test == 0时放一个数据断点。当断点触发时,您将能够看到哪个代码重置此变量。 祝你好运! E.L。 以上来自于谷歌翻译 以下为原文 I'm quite sure there is yet another code except the code you've published here... Anyway, I would suggest you to put a data breakpoint when test==0. When the breakpoint triggers, you would be able to see which code resets this variable. Good luck! E.L. |
|
|
|
|
|
|
|
编译器输出的代码包含问题的答案。
您的代码包含ISR和主代码之间的访问冲突。 当您指定测试是易失性时,编译器假定其值可能在两次连续读取之间发生变化,但它不会使分配成为原子,即ISR可能会中断它。 只有汇编指令是原子的(有一些例外,例如DIVW指令可能被中断,但它们只影响核心寄存器),而赋值通常包含两个汇编指令:一个读取指令(例如LD A,test)和写一个(例如LD测试,A)。 编译器有时输出MOV测试,测试是原子指令。 这意味着您应该注意汇编代码以了解发生的情况并对代码进行正确的更正。 如果在分配之前禁用中断并在之后启用它们,则访问冲突将消失,但此修复程序会将两个字节添加到可执行文件大小。 BR EtaPhi 以上来自于谷歌翻译 以下为原文 The code which your compiler outputs contains the answer to your question. Your code contains an access conflict between the ISR and the main code. When you specify that test is volatile, the compiler assumes that its value may change between two consecutive reads, but it doesn't make the assignment atomic, i.e. the ISR may interrupt it. Only assembler instructions are atomic (there ase some exceptions, for instance a DIVW instruction may be interrupted, but they affect only core registers), while an assignment consists usually in two assembly instructions: a read one (eg. LD A,test) and a write one (eg. LD test,A). The compiler sometimes outputs a MOV test,test which is an atomic instruction. This means that you should watch at the assembler code to know what happens and to take the right correction to your code. If you disable interrupts before the assignment and enable them afterwards, the access conflict disappears, but this fix adds two bytes to the executable size. BR EtaPhi |
|
|
|
当变量设置为0时(我永远不会发生),我试图设置一个数据中断,并在装配线处断开:
以上来自于谷歌翻译 以下为原文 I tried to set a data break when the variable was set = 0 (Which never should happen) and it breaks at a assembly line saying: |
|
|
|
当初始化所有全局变量(即设置为零)时,断点在初始化阶段停止了代码。
这意味着你的main()仍然会被执行,所以这个汇编程序转储是没用的...... 以上来自于谷歌翻译 以下为原文 The breakpoint stopped your code in the initialization phase when all global variables are initialized, i.e. set to zero. This means that your main() is still going to be executed, so this assembler dump is useless... |
|
|
|
你可以试试这个。
main.c在主模块之前声明变量。 char test = 0x00; (不要只使用test = 0,这是非常重要的) 在interupt文件模块中, 外部测试; 祝你好运 以上来自于谷歌翻译 以下为原文 you may try this. main.c declare the variable before main module. char test = 0x00; (don't use just test = 0, it is very impotant) at interupt file module, extern test; good luck |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2741 浏览 1 评论
3244 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1813 浏览 1 评论
3653 浏览 6 评论
6044 浏览 21 评论
1342浏览 4评论
203浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
356浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
446浏览 2评论
STM32处理增量式编码器Z信号如何判断中断是正转的还是反向转的?
275浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 04:38 , Processed in 1.254656 second(s), Total 91, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号