-
突发奇想,想写一个双任务的调度程序,主程序用汇编,两个任务程序同样用汇编写时没有问题。
想着任务程序一般用C开发,结果就遇到了上述问题。
根据您的建议,变量声明使用__no_init应该没有问题,从汇编代码看也正常,只是必须在C任务中进行变量的初始化。
但是在C子程序中作整除运算不好解决(整乘可以,但3.42版本也不行),原来理解单独编译这段C代码通过,说明是把库函数正常调用了,但link报错,简单以为是IAR的设置问题。这个问题也可以替代解决:自己写一些除函数汇编代码,在C任务中去调用,但感觉C中的加减乘除代码不好看。
最后再次感谢各位朋友的帮助!
最后小结一下:
1.主程序和子程序都用C时正常
2.主程序和子程序都用汇编也正常
3.主程序用C,子程序用汇编正常
4.主程序用汇编,子程序用C,汇编中可声明函数和变量,也可被C使用,C中也可声明函数,不能直接声明全局变量(除非使用__no_init关键字),并且C函数中不能使用(/%,3.42甚至不能使用*)运算。
再次表示感谢!
-
是完整的代码
DivMod16u应是系统生成的除运算汇编程序
-
再顶一下
-
上面问题中得全局变量kk必须在C程序中(实际需要)
-
//====================================================主程序#include "msp430x44x.h" extern chu//------------------------------------ NAME main ORG 0FFFEh DW RESET //------------------------------------ RSEG CSTACK RSEG CODE//------------------------------------RESET mov.w #SFE(CSTACK),SPmain mov.w #WDTPW+WDTHOLD,&WDTCTL//------------------------------------- mov.w #40,R12; mov.w #20,R13; call #chu//-------------------------------------main1 jmp main1 //------------------------------------- END
//======================================================子程序#include "msp430x44x.h"unsigned int kk;unsigned int chu(unsigned int i,unsigned int j){ kk=kk+1;//完成一次全局变量计数 return(i/j);//主程序中进行调用}
//=======================================================报错:Error[e46]: Undefined external "?cstart_init_zero" referred in quanjuyuchu ( G:\ Error[e46]: Undefined external "?DivMod16u" referred in quanjuyuchu ( G:\
//=======================================================备注
我用的5.2版本的IAR 不知道是哪里设置出的问题?请各位大侠帮助解决:)
[ 本帖最后由 jhw3378 于 2012-2-10 10:17 编辑 ]
-
子程序进行加减计算是可以的
-
我用的是
IAR Assembler for MSP430
V3.42A/W32 (3.42.1.9)
-
非常感谢
-
自己顶一下