This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TMS320F28379D:SYS/BIOS 文档中的 HwiHook 示例代码问题

Guru**** 2577385 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/786814/rtos-tms320f28379d-problem-with-hwihook-example-code-in-sys-bios-document

器件型号:TMS320F28379D

工具/软件: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 示例代码中未找到。

谢谢、

灵活

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第16行对 Error_init()的调用在 C 语言中无效。请将该行移至 main()的开头,然后重试。
    感谢您报告错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在对电路板进行编译和调试之后、当我拔下电源并再次插上电源时、我发现电路板复位为空白程序
    你可以告诉我吗?
    我的目标是使用带有 SYS/BIOS 的 CANbus 中断、现在我可以使用带有非 BIOS 的 CANbus 中断
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    灵活、

    请打开此新主题的新论坛主题。  并提供有关“重置为空白程序”的更多详细信息–您的程序是否完全从闪存中消失?  

    如果您的意思是器件没有自动引导至您先前使用调试器加载到闪存的程序…  SYS/BIOS 具有一个“引导”模块,可提供多个引导时初始化选项,包括“从闪存引导”。  您可以在此处找到一些说明:http://processors.wiki.ti.com/index.php/SYS/BIOS_for_the_28x#Boot_Sequence_with_SYS.2FBIOS  该页面上显示的内容适用于早期器件,与 F28379D 不完全匹配,但概念是相同的。  

    如果引导模块不是您要查找的模块、请打开一个新的线程并提供有关问题的更多详细信息。
     
    谢谢、
    Scott