VDK带有器件驱动,一般如在DM642中使用的微驱动之类的东西,就是省却了工程师对底层部件的控制源代码的书写,换言之,要熟悉使用这些API函数,还要熟悉21369的底层接口和部件,不能简单 的调用一下函数了事,况且,ADI没有像TI那样提供足够的技术资料,很多API的调用都是要靠自己去翻源码出来阅读,而且要不断的猜测函数的作用,不是很方便,在C6713的BIOS当中,我是不使用其硬件驱动的,只是直接在初始化的时候把全部的部件都初始化完了,然后在OS中开启中断,再在中断里面发消息。这样也能达到程序设计的目的,感觉没有必要太劳累去迁就公司提供的API函数。
2011-11-14
今天看资料发现原来sharc是没有器件的驱动库函数了,跟bf系列不大一样,其实要不要驱动库都无所谓,因为作为音频专用的芯片,本来就没有多少外设需要做设置的,
都很简单,随便做个寄存器配置就行了,
同时,有文章可以从侧面证明,在ISR中直接使用VDK_C_ISR_PostSemaphore();不需要开启器件驱动。
Calling C_ISR_PostSemaphore from a thread
The ISR functions are not designed to be called from kernel or thread levels. In theory there should not be a problem doing but it is not something that we recommend. Instead, I would suggest calling the right API from the commonFoo function like this
Blackfin
inline int IS_USER_ISR_LEVEL (){
return (*pIPEND & ~( (1<<EVT_IRPTEN_P) | (1<< EVT_IVG15_P) | (1 << EVT_IVG14_P))) ;
}
return (*pIPEND & ~( (1<<EVT_IRPTEN_P) | (1<< EVT_IVG15_P) | (1 << EVT_IVG14_P))) ;
}
SHARC
#ifdef __2116x__
inline int IS_USER_ISR_LEVEL (){
return (sysreg_read(sysreg_IMASKP) & (~(SFT2I|LPISUMI)) );
}
inline int IS_USER_ISR_LEVEL (){
return (sysreg_read(sysreg_IMASKP) & ~SFT2I ) ;
}
#endif
inline int IS_USER_ISR_LEVEL (){
return (sysreg_read(sysreg_IMASKP) & (~(SFT2I|LPISUMI)) );
}
#else
inline int IS_USER_ISR_LEVEL (){
return (sysreg_read(sysreg_IMASKP) & ~SFT2I ) ;
}
#endif
So you could have something like
commonFoo()
{
if (IS_USER_ISR_LEVEL()) {
VDK_C_ISR_PostSemaphore();
} else {
VDK_PostSemaphore();
}
}
Of course you can change this and make it suit your needs. We are assuming that the reserved bits in IPEND are 0.