本文由asdwzl1980贡献
pdf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
2
Software development flow using C/C++
The shaded portion of the figure highlights the most common path of software development for C/C++ language programs.
第七章 DSP的C语言编程 的 语言编程
主讲: 主讲:胡文静 博士
09:16:59
湖南理工学院 胡文静
AH1
3
幻灯片 3 AH1 standard input and output , string manipulation, dynamic memory allocation, data conversion
Avon Hu, 2007/5/2
C/C++ Complier Overview
ANSI Standard
The C54x C/C++ compiler is a full-featured optimizing compiler that translates standard ANSI C/C++ programs into C54x assembly language source. The following subsections describe the key features of the compiler. – ANSI-standard C
The compiler fully conforms to ANSI C Standa
rd.
– C++
The compiler also supports C++.
– ANSI-standard runtime support
All runtime library functions conform to ANSI-standard.
09:16:59
湖南理工学院 胡文静
4
5
Output Files
– Assembly source output
Generates assembly language source files that you can inspect easily, enabling you to see the code generated from the C/C++ source files.
Compiler operation
– Integrated Preprocessor
The C/C++ preprocessor is integrated with the parser, allowing faster compilation. Standalone preprocessor or preprocessor listing is also available.
– COFF object files
Common Object File Format, allows the user to define the system’s memory map at link time. system’
– Optimization
Uses a sophisticated optimization pass that employs several advanced techniques for generating efficient, compact code from C/C++ source. General Optimization for any C/C++ code and C54x specific optimizations for C54x architecture.
– Code to initialize data into ROM
Enables the user to link all code and initialization data into ROM, allowing C/C++ code to run from reset.
湖南理工学院 胡文静
09:16:59
09:16:59
湖南理工学院 胡文静
6
7
CCS的C语言简介
由DSP厂商及第三方为DSP提供C编译器; 编译器; 软件成为可能; 使得采用高级语言开发DSP软件成为可能; TI公司的CCS又提供了优化的C编译器; 编译器;
– 优化后的C编译器得到的代码效率只比汇编语言低 10% ̄20%;
DSP的C语言特性
标识符和常数(Identifier and Constant)
– 标识符大小写敏感,且前100个字符有效; 字符有效; – 主机和目标字符集为ASCII吗,不存在多字节字符 – 多字符常数按最后一个字符编码。 编码。 – 与普通C语言类似,不同的是C54x的一个字节为 语言类似, 16bits,而并非8bits; – 表数范围也相应
有所变化; 表数范围也相应有所变化; – size_t的类型为unsigned int,也就是sizeof运算符的 结果; 结果; – prtdiff_t的类型为int—指针相减的结果。 指针相减的结果。
湖南理工学院 胡文静
数据类型(Data Types)
DSP的C编译器还在不断优化; 编译器还在不断优化; DSP的C编译器符合ANSI C标准; 标准; ANSI C标准会受处理器、运行环境或主机环境 标准会受处理器、 的影响。 的影响。
湖南理工学院 胡文静
09:16:59
09:16:59
8
9
Data Conversion()
– Float-to-int conversions truncate toward 0. Float- to– Pointers and integers can be freely converted, as long as the result type is large enough to hold the original value.
Expressions
– When two signed integers are divided and either is negative, the quotient is negative, and the sign of the remainder is the same as the sign of the numerator. The slash mark (/) is used to find the quotient and the percent symbol (%) is used to find the remainder. For example,
10 / -3 == -3 -10 / 3 == -3 10 % 3 == 1 -10 % 3 == -1
– A right shift of a signed value is an arithmetic shift; that is, the sign is preserved.
09:16:59
湖南理工学院 胡文静
09:16:59
湖南理工学院 胡文静
10
11
Declarations
– The register storage class is effective for all chars, shorts, ints, and pointer types. – Structure members are not packed into wo
rds (with the exception of bit fields). Each member is aligned on a 16-bit word boundary. – A bit field of type integer is signed. Bit fields are packed into words beginning at the high-order bits, and do not cross word boundaries. – The interrupt keyword can be applied only to void functions that have
no arguments.
09:16:59
访问数据空间
– 通过指针来实现; 来实现;
*(unsigned int *) 0x1000=a; b=*(unsigned int *) 0x1001;
– 访问数据空间的地址可以不事先进行定义;
… for (unsigned int i=0;i<cnt;i++) i=0;i<cnt;i++) { tmp = *(unsigned int *) (org + i); *(unsigned int *) (org + offset + i) = tmp; tmp; }
09:16:59
湖南理工学院 胡文静
湖南理工学院 胡文静
12
13
C/C++ 关键字(Keywords) 关键字(
– const:用于申明常量,其值不能被更改;编译器在 用于申明常量,其值不能被更改; const段为常量分配空间;会被volatile和auto屏蔽。 段为常量分配空间; 屏蔽。
可以用于定义分配于系统ROM中的常量表 可以用于定义分配于系统ROM中的常量表
※ const
C/C++ 关键字(续)
– interrupt:用于定义中断服务函数
interrupt void handler() handler()
int p[] = {1,2,3,4,5,6,7,8};
– near和far:定义函数的调用方式(-mf选项) 定义函数的调用方式( 选项)
near对应CALL指令 对应 near对应CALL指令 far对应FCALL指令 对应FCALL指令 far对应 near和far只影响CALL指令形式,而不会对函数的实际 只影响CALL指令形式 指令形式, 不会对函数的 对函数的实际 near和 far只影响 地址产生影响 near— 16位 far— 24位 产生影响; 地址产生影响;near—16位,far—24位 如
※ far
– ioport:用于访问i/o空间
ioport type porthex_num porthex_num
※ type 必须是char, 必须是char, ※ porthex_num为端口号,hex_num为16进制数 为端口号, porthex_num为端口号 hex_num为 16进制数
int, short, unsigned之一 int, unsigned之一
端口变量的定义必须是文件级的 端口变量的定义必须是文件级的 文件级
ioport unsigned port10; port10=a; a=port10+b; b=port10; port10+=a; 函数调用时采用传值而非传址: 函数调用时采用传值而非传址:func (port10) 非 func (&port10)
09:16:59
int foo(); foo(); ※ static far int foo(); foo(); ※ near void foo(); foo();
09:16:59
湖南理工学院 胡文静
湖南理工学院 胡文静
14
15
C/C++ 关键字(续)
– volatile:提示它后面定义的变量可能随时被修改;使得编 volatile:提示它后面定义的变量可能随时被修改; 译后的程序需要存储或读取这个变量的时候, 译后的程序需要存储或读取这个变量的时候,都会直接从变 量地址中读取数据。 量
地址中读取数据。
c编程网站 如果没有volatile关键字,则编译器会对变量存储与读取进行优化, 如果没有volatile关键字,则编译器会对变量存储与读取进行优化, 关键字 可能暂时使用寄存器中的值;当其
他程序修改了变量的值时, 可能暂时使用寄存器中的值;当其他程序修改了变量的值时,将会 出现不一致的现象。 出现不一致的现象。
如下代码 short flag; volatile short flag; void test() { 忠告: 忠告:只要是等待别的程序修改某个变量值 do1(); do1(); 修饰符! 的话,就对这个变量加上volatile修饰符! 修饰符 的话,就对这个变量加上 while (flag==0); do2(); } ※ 经编译器优化后,可能会出现死循环!!! 经编译器优化后,可能会出现死循环!!!
※
09:16:59
预处理 (Pragma 指示字)
– 告诉编译器如何对代码、变量进行预处理; 告诉编译器如何对代码、变量进行预处理; – 预处理器会忽略任何不支持的 #pragma 指示字; 指示字; – 支持的pragma指示字: 指示字: 支持的 指示字
CODE_SECTION DATA_SECTION FUNC_CANNOT_INLINE
FUNC_EXT_CALLED FUNC_IS_PURE FUNC_IS_SYSTEM FUNC_NEVER_RETURNS FUNC_NO_GLOBAL_ASG FUNC_NO_IND_ASG 09:16:59
IDENT INTERRUPT NO_INTERRUPT
湖南理工学院 胡文静
湖南理工学院 胡文静
16
17
CODE_SECTION伪指令
– 为symbol在名为section_name的段分配存储空间; 的段分配存储空间;
.global – 用途:为代码在非.text段分配存储空间 _funcA 用途: ;********************************* – 举例: 举例: ;*
FUNCTION DEF: _funcA * ;********************************* #pragma CODE_SECTION ( funcA, “codeA”) _main: int funcA ( int a) FRAME #–2 NOP { STL A,*SP(0) int i; STL A,*SP(1) FRAME #2 return (i = a); RET } ;return occurs
DATA_SECTION伪指令
– 为symbol在名为section_name的段分配存储空间
#pragam DATA_SECTION ( symbol, “section_name” ) section_name” #pragam DATA_SECTION ( “section_name” ) //In C++ section_name”
#pragma CODE_SECTION ( symbol, “section_name” ) section_name” #pragma CODE_SECTION ( “section_name” ) //In C++ section_name” .sect “codeA”
– 用途:为变量在非.bss段分配存储空间 用途: – 举例: 举例:
#pragma DATA_SECTION(bufferB, ”my_sect”) char bufferA[512]; .global _bufferA char bufferB[512]; 或 .bss _bufferA,512,0,0 .global _bufferB char bufferA[512]; _bufferB: #pragma DATA_SECTION(”my_sect”) .usect ”my_sect”,512,0,0 char bufferB[512];
09:16:59
09:16:59
湖南理工学院 胡文静
湖南理工学院 胡文静
18
19
FUNC_EXT_CALLED伪指令
– 通知优化器保留随后的外部调用函数; 通知优化器保留随后的外部调用函数;
#pragma FUNC_EXT_CALLED (func) [;] #pragma FUNC_EXT_CALLED [;]
C/C++的段(Sections) 的段(
– 和汇编语言类似,也分为初始化和未初始化两类; 和汇编语言类似,也分为初始化和未初始化两类; – 初始化段(Initialized Sections) 初始化段(
.cinit: tables for initializing variables and constants cinit: .pinit: table for calling global object constructors pinit: .const: string constant and data (excluding volatile) const: volatile) .switch: table for switch statements switch: .text: all executable code, string literals and constants text:
– 用途:在程序级优化时,保留未被main函数直接或 用途:在程序级优化时,保留未被 函数直接或 间接调用的函数或被此函数调用的函数; 间接调用的函数或被此函数调用的函数;
asm语句 语句
– 在编译器输出的汇编语言代码中直接嵌入汇编语 从而实现一些在C语言中难以实现或实现起来 句,从而实现一些在 语言中难以实现或实现起来 较难的硬件控制功能; 较难的硬件控制功能; – 语法:asm(“ 汇编指令 ”); 语法:
09:16:59
– 未初始化段(Uninitialized Sections) 未初始化段(
.bss: reserves data spaces for global, static vars bss: .stack: allocates space for system stack stack: .system: allocates space for dynamic memory system:
09:16:59
湖南理工学院 胡文静
湖南理工学院 胡文静
20
21
C/C++段存储
Section .bss .cinit .pinit .const .data Memory
RAM ROM or RAM ROM or RAM ROM or RAM
静态(static)和全局(global)变量的初始化
Page 1 0 1 1 Section .text .stack .switch .system Memory
ROM or RAM
Page 0 1 0 1
– 利用连接器通过cmd文件在目标文件中初始化
SECTIONS {
… .bss: fill=0x00; bss: …
RAM
ROM or RAM
} 弊端: 使得.out文件变大,而变大的部分并非程序代码。 .out文件变大 弊端: 使得.out文件变大,而变大的部分并非程序代码。
RAM
– 利用const关键字定义并初始化
const int i; const int i=0;
.sect .const _i: .word 0 湖南理工学院 胡文静
Program memory, Data memory memory,
09:16:59
湖南理工学院 胡文静
09:16:59
22
寄存器规则—使用与保护规则
23
系统堆栈
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论