说说几个小问题吧,一般咱们在用KEIL的时分,只需编译器报
– 0 Error(s) 一般咱们都不去管多少个 Warning(s).了,一般这样程序根本都能运转,可是其实细心想想,这儿仍是有问题的,不然编译器没事吃饱了撑得,报什么正告啊~~~
今日来说说*** WARNING L15: MULTIPLE CALL TO SEGMENT这个问题!
其实这个问题应该是引起留意的,有或许引起程序抵触,可是一般时分程序运转不会有问题,可是假如出来问题,那将会是很厌烦的问题.
剖析一下 发生这一正告的一个本源是:例如在主循环里调用了一个函数,而在中止服务中,你又一次调用了相同的函数。这样当主循环运转到该函数中时, 一旦发生中止,则在中止里又再次调用该函数!而使得该子函数发生了重入,这时,经管概率很低,可是很或许犯错!这样,编译器就给出了正告!告知你*** WARNING L15: MULTIPLE CALL TO SEGMENT ,表达的意思是发生了重入!字面意思自己了解去吧~~~
想要防止这种状况的办法
一.用reentrant使函数重入
关于reentrant的阐明:
1,重入函数不能传递bit类型的参数和变量;
2,重入函数树立的是模仿仓库区,所以不运用一般函数坐落存储形式默许空间的可掩盖式仓库,而是在同一空间从顶端另行分配一个非掩盖式的重入仓库。
small 默许空间是 data;
compact 默许空间是 pdata;
largr 默许空间是 xdata;
3,因为要保存参数和局部变量,所以会耗费很大的栈空间;尽量少用这种形式;
4、 在同一程序中能够界说和运用不同存储器形式的重入函数,恣意形式的重入函数不能调用不同存储器形式的重入函数,但能够调用一般函数。
5、 实践参数能够传递给直接调用的重入函数。无重入特点的直接调用函数不能包括调用参数。
二.假如空间多的话,能够界说两个同功用的函数,分别在中止和中止外调用
其他办法没研究出来,嘿嘿~~~对了 我主张用第二种办法好点,第一种有些约束,不爽~~
WARNING L15: MULTIPLE CALL TO SEGMENT
这个问题有必要留意,或许引起程序抵触,假定你用于自动化范畴,则或许导致信号发生尖峰。 发生这一正告的一个本源是:你在主循环里调用了一个函数(如aaa),而在中止服务函数里,你用调用了这个函数(如aaa)。这样当主循环运转到该函数中 是,一旦发生中止,则在中止里又再次调用该函数!这时,很或许犯错! 防止这种状况的办法许多:如,在进中止的时分置需调用该函数的标志,而在主循环中调用该函数