Part Number:TMS320F280049
我们现在有一个需求,是想把CCS工程下的某个.c文件封装成.lib文件或者是把某个函数封装起来,请各位专家有相应的方法或者可以参考的资料吗?请帮忙提供一下,谢谢!
Green Deng:
你好,要生成库文件的话需要在新建工程的时候就选择库的形式输出,也就是如下框中的格式:
,
Han Meng:
您好,感谢回复!另外,想再问一下.cla文件封装成.lib文件也是相同的方法吗?
,
Han Meng:
您好,我尝试将CLA_task.cla文件封装成.lib文件,但是编译出现如下的问题,请问是什么原因呢?谢谢!
,
Green Deng:
这个还真没操作过.cla转.lib的,你是将.cla里面的代码复制到新建的.lib工程中之后编译出现的这个报错吗?
,
Han Meng:
对的,是这样的,生产lib文件编译中报的错。
,
Green Deng:
那可能是CLA有限制,本身CLA调用lib库也有限制,比如
More than 2 levels of function nesting
Function with more than two arguments
所以我也没有看到过将.cla封装成.lib的情况
,
Han Meng:
我找了一下编译出错的原因,发现和CLA_cfg.h中Cla1BackgroundTask()的函数声明有关,如图1红色圈中所示。初始时我们在CLA中用的是__attribute__((interrupt("background"))) void Cla1BackgroundTask(); 在生成.lib文件过程中编译会出错。我将其替换成__attribute__((interrupt)) void Cla1BackgroundTask();后编译可以通过,如图2所示。对于图1中的#if defined(__TMS320C28XX__)不明白是什么含义,可以帮忙解释一下吗?是不是我们之前在CLA中用的Cla1BackgroundTask()有问题?
图1
图2
,
Green Deng:
你好,很抱歉的是,关于“__attribute__((interrupt("background"))) void Cla1BackgroundTask();”和“__attribute__((interrupt)) void Cla1BackgroundTask();”的区别我也不太清楚。
关于#if defined(__TMS320C28XX__)的话是一个宏定义,编译器手册中的官方解释是:Defined if target is C28x
,
Han Meng:
你好,谢谢回复!我们用的是F280049,那应该要用__attribute__((interrupt)) void Cla1BackgroundTask()这个函数,请问我这么理解对吗?因为确实用了这个函数之后,用.cla文件生成.lib文件编译时就不会报错。只是比较奇怪的是,在原工程文件中即使用“__attribute__((interrupt("background"))) void Cla1BackgroundTask();”编译也不会报错。
,
Green Deng:
Han Meng 说:我们用的是F280049,那应该要用__attribute__((interrupt)) void Cla1BackgroundTask()这个函数,请问我这么理解对吗?
我认为是的,不过原因的话我的猜测是,这段代码本来是给CLA用的,所以原工程用#else中的内容可以。而生成库的话编译器可能理解为是给C28核用的,所以要用__attribute__((interrupt)) void Cla1BackgroundTask()
不过只是猜测,没什么根据。
,
Han Meng:
好的,非常感谢!
,
Green Deng:
客气了!