- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C55x理器的软件设计49
C55x处理器的软件设计 ;C55x处理器软件开发流程 ;C55x处理器程序基本结构;自我调度程序的基本结构 ;中断程序1
……
中断程序m;
Main( )
{
DSP_INT( ){……}; //DSP初始化
for(;;) //主循环
{
if(条件1) //判断条件1
{
处理模块1; //条件满足运行处理模块1
};
……
if(条件n) //判断条件n
{
处理模块n; //条件满足运行处理模块n
};
}
};应用嵌入式操作系统 ;嵌入式操作系统的核心是操作系统内核
优先级的内核可以分成两种类型
不可剥夺型内核—合作型多任务
要求每个任务主动放弃CPU使用权
每个任务相互合作,共享一个CPU
异步事件由中断服务来处理
允许任务使用不可重入函数
优点是响应中断快
可剥夺型内核
具有最高优先级的任务就绪,得到CPU的使用权
不应直接使用不可重入函数
主要工作是完成任务(进程)的调度 ;任务管理 ;任务状态转换 ;两种类型
二进制型—看做一个只有一位的计数器型信号量
计数器型
两个任务之间利用信号量来取得同步
单向同步
任务用一个信号量触发另一个任务
双向同步
;C语言程序开发及优化 ;对I/O空间进行寻址
关键字ioport
ioport类型只能用来声明全局或静态变量
在本地变量中使用ioport类型,则变量必须用指针声明 ;在printf()中引用ioport指针的举例:
ioport int *p;
printf(”%p\n”, (void*)p);
注意:则必须进行强制类型转换“void *” ;指向I/O空间数据指针的举例:
/* 指向ioport数据: */
ioport int * ptr_to_ioport;
ioport int i;
void foo (void)
{
int j;
i = 10;
ptr_to_ioport = i;
j = *ptr_to_ioport;
}
编译结果:
_foo:
MOV #_i,*abs16(#_ptr_to_ioport) ; 存储_i的地址
MOV *abs16(#_ptr_to_ioport),AR3
AADD #–1, SP
MOV #10,port(#_i) ; 向_i中存入10
MOV *AR3,AR1
MOV AR1,*SP(#0)
AADD #1,SP
return ;利用ioport指针指向I/O空间的数据的举例:
/* 指向ioport数据的ioport指针: */
ioport int * ioport iop_ptr_to_ioport;
ioport int i;
ioport int j;
void foo (void)
{
i = 10;
iop_ptr_to_ioport = i;
j = *iop_ptr_to_ioport;
}
编译结果如下:
_foo:
MOV #10,port(#_i) ; 将10存在_i中
MOV #_i,port(#_iop_ptr_to_ioport) ; 存储_i的地址
MOV port(#_iop_ptr_to_ioport),AR3 ; 载入_i的地址
MOV *AR3, AR1 ; 载入_i
MOV AR1,port(#_j) ; 将10存到_j中
return;interrupt关键字
定义中断函数
中断函数必须返回空并且没有参数传递
中断函数可以定义本地变量并且使用堆栈 ;onchip关键字
告诉编译器由该关键字定义的指针所指向的数据可以作为一个双乘法指令中的操作数 ;C语言与汇编语言的混合编程 ;C语言和汇编模块接口
C/C++中的寄存器规则
;函数调用规则
被调用函数的响应
子函数为本地变量、暂存空间以及函数本身可能调用函数的参数分配足够的空间,这些工作要在函数调用之初完成。
如果子函数修改一些寄存器,如T2、T3、AR5~AR7,需要子函数将这些数压栈或把它们存储到一个没有使用的寄存器中。如果子函数修改其他寄存器则不需要预先存储这些数。
如果子函数的参数是一个结构,它所收到的是指向这个结构的指针。如果在被调用函数中需要对结构进行写操作,就需要把这个结构复制到本地空间中,如果不进行写操作,则可以直接通过指针访问这个结构。
子函数执行代码。
函数按照表7-5的规则返回参数,如果子函数返回一个结构,父函数为这个结构分配空间,并传递指针到(X)AR0中。如果父函数没有使用这个结构,则在(X)AR0中返回的地址为0。
子函数将先前存储的寄存器值重新放到寄存
文档评论(0)