CubeSuite+生成c文件的执行入口问题
时间:10-02
整理:3721RD
点击:
新接触RL78G13,感觉步履维艰啊,可能是习惯于keil软件的思维,使用CubeSuite+生成代码的话,会产生一个r_main().c,
void main(void)
{
/* Start user code. Do not edit comment generated here */
while (1U)
{
;
}
/* End user code. Do not edit comment generated here */
}
为什么main函数不调用r_cg_port.c中的R_PORT_Create(void)函数,编译下载后仍然会产生事先设定的结果?不明白CubeSuite+生成的一堆.c文件到底是怎么组织并实现编译的,c语言不是从main函数为入口吗。
其实,C可以从main开始,但是单片机在执行到main()前已经进行了很多初始化操作了,一般不会从复位地址直接跳转到main的。复位后执行的是启动程序,启动程序在工程里看不到,但却调用了.具体的操作可以看看CubeSuite+安装目录\CA78K0R\V1.41\Src\cc78k0r\src中的cstart.asm
其中先执行
MOVW SP,#LOWW _@STBEG ;SP <- stack begin address
CALL !_hdwinit
后面再执行
;-----------------------------------------------------------------------------
; call main function
;-----------------------------------------------------------------------------
CALL !_main ;main();
而hdwinit在CodeGenerator生成的r_systeminit.c中定义了
void hdwinit(void)
{
DI();
R_Systeminit();
EI();
}
再看看 这个文件里R_Systeminit()的定义,举例说
void R_Systeminit(void)
{
PIOR = 0x00U;
R_CGC_Get_ResetSource();
R_PORT_Create();
R_CGC_Create();
R_TAU0_Create();
CRC0CTL = 0x00U;
IAWCTL = 0x00U;
}
所以 Create结尾的函数在main()前都已经调用了,用户只需要调Start/Stop等函数即可
如果不用Code Generator生成的代码自己写程序的话,可以不定义hdwinit(),直接在main()中调用初始化操作函数
void main(void)
{
/* Start user code. Do not edit comment generated here */
while (1U)
{
;
}
/* End user code. Do not edit comment generated here */
}
为什么main函数不调用r_cg_port.c中的R_PORT_Create(void)函数,编译下载后仍然会产生事先设定的结果?不明白CubeSuite+生成的一堆.c文件到底是怎么组织并实现编译的,c语言不是从main函数为入口吗。
其实,C可以从main开始,但是单片机在执行到main()前已经进行了很多初始化操作了,一般不会从复位地址直接跳转到main的。复位后执行的是启动程序,启动程序在工程里看不到,但却调用了.具体的操作可以看看CubeSuite+安装目录\CA78K0R\V1.41\Src\cc78k0r\src中的cstart.asm
其中先执行
MOVW SP,#LOWW _@STBEG ;SP <- stack begin address
CALL !_hdwinit
后面再执行
;-----------------------------------------------------------------------------
; call main function
;-----------------------------------------------------------------------------
CALL !_main ;main();
而hdwinit在CodeGenerator生成的r_systeminit.c中定义了
void hdwinit(void)
{
DI();
R_Systeminit();
EI();
}
再看看 这个文件里R_Systeminit()的定义,举例说
void R_Systeminit(void)
{
PIOR = 0x00U;
R_CGC_Get_ResetSource();
R_PORT_Create();
R_CGC_Create();
R_TAU0_Create();
CRC0CTL = 0x00U;
IAWCTL = 0x00U;
}
所以 Create结尾的函数在main()前都已经调用了,用户只需要调Start/Stop等函数即可
如果不用Code Generator生成的代码自己写程序的话,可以不定义hdwinit(),直接在main()中调用初始化操作函数
确实跟其他单片机有点不一样,搞了两天还没整明白
想问问小编,如果不用代码生成器,主机建立工程如何操作,我还不知道应该把哪个头文件包含进去
1) 如果你确定自己是小白,而且大神已经告诉你了,怎么玩,你就跟着大神这么建工程师绝对没有错的;
2) 跟大神学得一点点手艺了,再把这个工程复制过来,重建自己的另一个工程,CS+还是很不错的
如此复杂呀,学习了,谢谢了