[USF-XSim-62] 'simulate' step failed with errors. Please check the Tcl console or log files for more information.express
一、 在C语言代码中,行结尾反斜杠\ 起到换行做用,用于宏定义和字符串换行。其中宏定义使用居多。若是一行中有不少元素致使太长影响阅读,能够在结尾加 \ 的方式实现换行,编译时会忽略\以及其后的换行符,当作一行处理。………\就是表示一行不间断。函数
二、 关于各类电压:测试
VCCINT:内部PL核心电压spa
VCCAUX:辅助PL电压指针
VCCBRAM:PL BRAM电压orm
VCCPINT:PS内部核心电压进程
VCCPAUX:PS辅助电压ci
VCCDDR:DDR RAM的工做电压路由
VREFP:XADC正参考电压字符串
VREFN:XADC负参考电压
三、
#ifdef __cplusplus
Extern “C”{
#endif
代码说明:
为了在C++代码中调用用c写成的库文件,就须要用extern”C”来告诉编译器:这是一个用C写成的库文件,请用C的方式来连接它们。
#define Xil_AssertNonvoid(Expression) \
{ \
if (Expression) { \
Xil_AssertStatus = XIL_ASSERT_NONE; \
} else { \
Xil_Assert(__FILE__, __LINE__); \
Xil_AssertStatus = XIL_ASSERT_OCCURRED; \
return 0; \}}
这个assert宏将用于返回值的函数,与Xil_AssertWait boolean进行容纳测试,以便失败的断言继续执行。
一旦参数错误,将会执行 Xil_Assert(__FILE__, __LINE__);
Xil_AssertStatus =XIL_ASSERT_OCCURRED;
他只需设置Xil_AssertStatus标志,并将错误位置信息转换为指定的路由。
其中XIL_Assert的代码为
void Xil_Assert(const char *File, int Line)
{
/* if the callback has been set then invoke it */
if (Xil_AssertCallbackRoutine != 0) {
(*Xil_AssertCallbackRoutine)(File, Line);
}
/* if specified, wait indefinitely such that the assert will show up in testing */
while (Xil_AssertWait) {
}
}
一旦路由(route)等于0,即进行无限循环。
SDK函数库中在xil_assert文件中定义了两种函数返回的方式。
第一种:
typedef void (*Xil_AssertCallback) (const char8 *File, s32 Line);
此处经过typedef定义了一个指针,该指针指向的数据类型为一个文件地址和一个操做属性。该定义在库中的说明是:
This data type defines a callback to be invoked when an assert occurs. The callback is invoked only when asserts are enabled
意思是次数据类型定义在发生断言时要调用的回调,只有在启用Assert时才会调用回调。
这个定义在void Xil_AssertSetCallback(Xil_AssertCallback Routine) {
Xil_AssertCallbackRoutine = Routine;
};中进行引用,该函数的传入参数是Xil_AssertCallback类型的参数,参数Routine是一个指针,改指针所指向的地址寄存器中包含中文件(即主函数中上次执行的位置)和操做类型(Line)。对于赋值的Xil_AssertCallbackRoutine将在
void Xil_Assert(const char8 *File, s32 Line)
{
/* if the callback has been set then invoke it */
if (Xil_AssertCallbackRoutine != 0) {
(*Xil_AssertCallbackRoutine)(File, Line);
}
/* if specified, wait indefinitely such that the assert will show up
* in testing
*/
while (Xil_AssertWait != 0) {
}
}
中进行判断,该值就是一个进程的位置和操做属性的存储位置的指针。若是指针不为NULL,则toggle to该指针指向的位置按照操做说明进行对应的操做。
接下来,该函数在
#define Xil_AssertNonvoid(Expression) \
{ \
if (Expression) { \
Xil_AssertStatus = XIL_ASSERT_NONE; \
} else { \
Xil_Assert(__FILE__, __LINE__); \
Xil_AssertStatus = XIL_ASSERT_OCCURRED; \
return 0; \
} \
}
中进行调用,若是传入的expression==1则断言状态变量为0,不然为1。可是,须要注意的是:Xil_Assert(__FILE__, __LINE__);因为没有有效的文件名称和操做属性传入,程序会在该函数中无限循环,不要被后面的return 0骗了,后面的语句是在test条件下才会有的,因此,若是传入的表达式是false,则程序无限循环。
以上即为AssertNonvoid(expression)函数的原理!
入口参数: 配置实例地址和设备ID
实例初始化配置完毕以后,复位IIC设备使其进入初始化状态,设备配置在初始化完成以后,设备启动以前进行。
一、 停止正在进行的全部传输__XiixPs_Abort()
(1)、读取IIC中断屏蔽寄存器IMR,地址(0xe0004000+0x20)
(2)、写中断禁用寄存器IDR,地址(0xe0004000+0x28),在中断禁用寄存器设置一个位,设置中断掩码寄存器中的相应位,有效的禁用要生成的相应中断。
(3)、写中断控制寄存器ICR,地址(0xe0004000+0x00),写入0x40,复位控制寄存器并将fifi初始化为0,清除传输寄存器,设置后将在下一个APB时钟自动清除。
(4)、读中断状态寄存器ISR,地址(0xe0004000+0x10),再写入该寄存器防止中断挂起
(5)、恢复中断状态,因为已经读取了中断掩码寄存器,掩码寄存器为1的位对应的中断不能使能,因此对掩码寄存器的容许的中断对应的位即为0,进行去反操做写入中断使能寄存器,从而有效的产生对应中断。
inclusion:
在进行复位以前要先终止全部的数据传输,这里的传输不单单是清除fifo,还有防止有突发中断的产生,因此首先读取中断掩码寄存器,该寄存器中为1的位禁止对应的中断,而后再读取清除fifo,而后再读取中断状态寄存器再写入防止中断悬空,最后使能中断,使能的是中断掩码寄存器容许的位,最后退出。
二、寄存器写操做
2.1 复位中断控制寄存器
2.2复位中断超时寄存器
2.3 复位全部中断使能寄存器(所有禁止)
此函数用于中断控制寄存器和中断掩码寄存器是否为默认值,读取完毕以后进行比较,比较成功以后再写入控制、超时、使能寄存器,由于读取的时候对应寄存器的显示电平状态可能发生了改变,因此要再写一次。
最后再写入、读取一次,再写入,此次写入的寄存器为从设备暂停寄存器,需单独写入配置,最后在进行复位操做。
传入参数为(I2C_Ptr,IIC_SCLK_RATE),,输入实例和理想baudrate
Include:
主要是寄存器的初始化为中断配置,而后进行自检测,最后设置BAUDRATE。
输入信号
输入信号 |
信号名 |
功能描述 |
S00_axi_aclk |
总线信号 |
|
Axi_aresetn |
总线复位,低电平有效 |