工具/软件:TI-RTOS
您好!
我从 F28379D 上的 SYS/BIOS 开始。 我阅读了文档
并尝试遵循它。
我在 HwiHook 示例代码中测试时发现了一些问题、编译时出现了错误。
-项目文件结构
-main.c
#include
#include
#include
#include
#include
#include
#include
#include
extern Timer_handle myTimer;
volatile bool myEnd2Flag = false;
int myHookSetId1、myHookSetId2;
Error_Block EB;
Error_init (&EB);
/* HookSet 1函数*/*
=== myRegister1 ====
*在 Hwi 模块启动期间调用、在 main()之前
*对于每个 HookSet */
void myRegister1 (int hookSetId){
System_printf ("myRegister1:分配的 hookSet ID =%d\n"、hookSetId);
myHookSetId1 = hookSetId;
}
/*=== myCreate1 ======
*在 main ()之前的 Hwi 模块启动期间调用
*用于静态创建的 Hwi */
void myCreate1 (Hwi_handle hwi、Error_Block * EB){
ptr pEnv;
pEnv = Hwi_getHookContext (hwi、myHookSetId1);
/* pEnv 此时应为0。 如果没有、则存在错误。 *
System_printf ("myCreate1:pEnv = 0x%x、time =%d\n"、pEnv、Timestamp_get32 ());
hwi_setHookContext (hwi、myHookSetId1、(ptr) 0xdad1);
}
/*=== myBegin1 ====
*在计时器 Hwi func 之前调用*/
void myBegin1 (Hwi_handle hwi){
ptr pEnv;
pEnv = Hwi_getHookContext (hwi、myHookSetId1);
system_printf ("myBegin1:pEnv = 0x%x、time =%d\n"、pEnv、Timestamp_get32 ());
hwi_setHookContext (hwi、myHookSetId1、(ptr) 0xbeef1);
}
/*=== myEnd1 ====
*在计时器 Hwi func 之后调用*/
void myEnd1 (Hwi_handle hwi){
ptr pEnv;
pEnv = Hwi_getHookContext (hwi、myHookSetId1);
system_printf ("myEnd1:pEnv = 0x%x、time =%d\n"、pEnv、Timestamp_get32 ());
hwi_setHookContext (hwi、myHookSetId1、(ptr) 0xc0de1);
}
/* HookSet 2函数*/
/*=== myRegister2 ====
*在 main 之前的 Hwi 模块启动期间调用
*对于每个 HookSet */
void myRegister2 (int hookSetId){
System_printf ("myRegister2:分配的 hookSet ID =%d\n"、hookSetId);
myHookSetId2 = hookSetId;
}
/*=== myCreatore2 ======
*在 main 之前的 Hwi 模块启动期间调用
*对于静态创建的 Hwi */
void myCreate2 (Hwi_handle hwi、Error_Block * EB){
ptr pEnv;
pEnv = Hwi_getHookContext (hwi、myHookSetId2);
/* pEnv 此时应为0。 如果没有、则存在错误。 *
System_printf ("myCreate2:pEnv = 0x%x、time =%d\n"、pEnv、Timestamp_get32 ());
hwi_setHookContext (hwi、myHookSetId2、(ptr) 0xd死亡2);
}
/*=== myBegin2 ====
*在计时器 Hwi func 之前调用*/
void myBegin2 (Hwi_handle hwi){
ptr pEnv;
pEnv = Hwi_getHookContext (hwi、myHookSetId2);
system_printf ("myBegin2:pEnv = 0x%x、time =%d\n"、pEnv、Timestamp_get32 ());
hwi_setHookContext (hwi、myHookSetId2、(ptr) 0xbeef2);
}
/*=== myEnd2 ====
*在计时器 Hwi func 之后调用*/
void myEnd2 (Hwi_handle hwi){
ptr pEnv;
pEnv = Hwi_getHookContext (hwi、myHookSetId2);
system_printf ("myEnd2:pEnv = 0x%x、time =%d\n"、pEnv、Timestamp_get32 ());
Hwi_setHookContext (hwi、myHookSetId2、(ptr) 0xc0de2);
myEnd2Flag = true;
}
/*=== myTimerFunc ====
*计时器中断处理程序*/
void myTimerFunc (UArg arg){
system_printf ("输入 myTimerHwi\n");
}
/*=== myTaskFunc ====== //
无效 myTaskFunc (UArg0、UArgarg1){
System_printf ("进入 myTask.\n");
Timer_start (myTimer);
/*等待计时器中断和 myEnd2完成*/
while (!myEnd2Flag){
;
}
System_printf ("myTask 正在退出...\n");
}
/*====== myIdleFunc ===== */
void myIdleFunc (){
system_printf ("输入 myIdleFunc ().\n");
System_exit (0);
}
/*=== main ==== //
int main (int argc、Char* argv[]){
System_printf ("正在启动 HwiHookExamples...\n");
BIOS_start();
返回(0);
}
/*=========== 文件结束==== *
-app.cfg
/*拉入时间戳以打印挂钩函数中的时间*/
xdc.useModule('xdc.runtime.Timestamp');
var Defaults = xdc.useModule('xdc.runtime.Defaults');
var Diags = xdc.useModule('xdc.runtime.Diags');
var Error = xdc.useModule('xdc.runtime.Error');
var Log = xdc.useModule('xdc.runtime.Log');
var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
var Main = xdc.useModule('xdc.runtime.Main');
var SysMin = xdc.useModule('xdc.runtime.SysMin');
var System = xdc.useModule('xdc.runtime.System');
var Text = xdc.useModule('xdc.runtime.Text');
VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
var Task = xdc.useModule('ti.sysbios.knl.Task');
var Idle = xdc.useModule('ti.sysbios.knl.Idle');
var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
idle.addFunc ('&myIdleFunc');
//
*取消注释此行以全局禁用断言。
*所有模块继承'库'模块的默认值。 您
*可以使用 Module.common$按模块覆盖这些默认值。
*禁用断言将节省代码空间并提高运行时性能。
Defaults.common$.diags_ASSERT = Diags.always_off;
*/
*
取消注释此行以防止模块名称加载到目标上。
*模块名称字符串放置在.const 段中。 将此
*参数设置为 false 将节省.const 段中的空间。 错误和
*断言消息将包含"未知模块"前缀、而
不是*实际模块名称。
*/
Defaults.common$.namedModule = false;
/*
最小化系统中的退出处理程序数组。 System 模块包括
*一组函数,这些函数在 System_atexit()中注册,
*由 System_exit()调用。
//
System.maxAtexitHandlers = 4;
/*
取消注释此行以禁用错误打印功能。
*禁用时,我们会丢失错误信息,因为
*不打印错误。 如果
*由于 Error_print()函数
*调用 System_printf(),禁用 raiseHook 将节省一些代码空间。
error.raiseHook =空;
*/
/*
取消注释此行以防止*在
目标上加载错误、断言和日志字符串。 这些字符串放置在.const 段中。
*将此参数设置为 false 将节省.const 段中的空间。
*错误、断言和日志消息将打印原始 ID 和 args、而不是
*格式化的消息。
//
text.isLoaded = false;
//
*取消注释此行以在
程序退出时禁用 SysMin *的字符输出。 SysMin 向循环缓冲区写入字符。
*可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
//
SysMin.flushAtExit = false;
//
* BIOS 模块将为系统创建默认堆。
*指定此默认堆的大小。
//
bios.heapSize = 0x0;
//系统堆栈大小(由 ISR 和 Swi 使用)*/
Program.stack = 0x100;
// System_printf ()的循环缓冲区大小*/
sysmin.bufSize = 0x400;
//
*为整个系统创建并安装记录
器*/
var LogerfParams = new LoggerBufParams (
var LoggerBufParfParams = 0;var LoggerBufParfParfLoggerf4);var LoggerfLoggerfParfLoggerfParams =创建并安装记录器
Defaults.common$.logger = logger0;
Main.common$.diags_INFO = Diags.always_on;
System.SupportProxy = SysMin;
/*
构建自定义 BIOS 库。 自定义库将小于
*预编译的"已检测"(默认)和"未检测"库。
*
* BIOS.logsEnabled 参数指定
是否在此自定义构建的 BIOS 中启用日志记录*。 RTA 和
* UIA 分析工具使用这些日志。
*
* BIOS.sertsEnabled 参数指定 BIOS 代码是否
*包括 assert()检查。 将此参数设置为"false"将生成
*更小、更快的代码、但建议
在*早期开发中启用断言、因为断言()检查将捕获大量编程
*错误(无效参数等)
//
BIOS.logsEnabled = false;
BIOS.ParertsEnabled = true;
BIOS.clockEnabled = false;
//使用默认任务参数创建 myTask */
var taskParams = new Task.Params();
Program.global.myTask = Task.create ('&myTaskFunc'、taskParams);
//创建 myTimer 作为 HstartTimer 的源
;
var TimerMode = xdc.useModule('ti.sysbios.hal.Timer');= TimerstartTimerTimer.Params;var Timer
timerParams.runMode = TimerTimer.Params = task.TimerTimerTimerTimerStart TimerTimerStart Timer =
timerParams.period = 1000;// 1ms
Program.global.myTimer = Timer.create (Timer.any、"&myTimerFunc"、timerParams);
//定义和添加两个 Hwi HookSets
*注意、不提供 deleteFxn。
//
//*挂钩集1 */
Hwi.addHookSet ({
registerFxn:'&myRegister1'、
createFxn:'&myCreate1'、
BegnFxn:'&myBegin1'、
endFxn:'&myEnd1'、
});
/* Hwi.addHookSet
({
registerFxn:'&myRegister2'、
createFxn:'&myCreate2'、
BegFxn:'&myBegin2'、
endFxn:'&myEnd2'、
});
错误响应
当我双击错误代码时、它会转到 main.c 中的位置错误
这些问题在 SwiHook 示例代码中未找到。
谢谢、
灵活


