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/AM3354:定时器 HWI 问题

Guru**** 2604225 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/648615/rtos-am3354-timer-hwi-question

器件型号:AM3354

工具/软件:TI-RTOS

您好、先生、

我混淆 了任务/HWI 的优先级。  我在项目中做了一些测试、结果如下所示:

降级1:

TimerHwiFunc (){

printf ("timer Hwi\n");

TaskFunc1()

while ();

降级2:

TimerHwiFunc (){

printf ("timer Hwi\n");

TaskFunc1()

while (){

Task_sleep (1);

"Demo1"  无法访问 HWI。  但 "Demo2" 可以进入 HWI。   

为什么在任务 死循环之后 SP 不能进入 HWI?

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否打开 Tools->ROV 并查看系统的状态? 例如、计时器是否创建正确。

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

    计时器状态:

    --------------------------------------------------------------------

    app.cfg:

    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 Memory = xdc.useModule('xdc.runtime.Memory'
    ) 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 Clock = xdc.useModule('ti.sysbios.knl.Clock');
    VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
    var Task = xdc.useModule('ti.sysbios.knl.Task');
    var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
    Program.global.sem = Semaphore.create (0);
    //var Hwi = xdc.useModule('ti.sysbios.family.arm.a8.intcps.Hwi');
    var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
    // var Timer = xdc.useModule('ti.sysbios.hal.Timer');
    
    var Queue = xdc.useModule('ti.sysbios.knl.Queue');
    Program.global.msgQueue = Queue.create ();
    Program.global.freeQueue = Queue.create ();
    
    var DmtTimer = xdc.useModule('ti.sysbios.timers.dmtimer.Timer');
    DmtTimer.intFreqs[1].lo = 24000000;// DM3 = Timer.intFreqs[1].hi Timer
    DmtTimer.intFreqs[1].hi = 0; // DMTimer 3 Timer.intFreqs[1].hi = 0;
    
    //BIOS.clockEnabled = false;
    Clock.tickSource = Clock.tickSource_user;
    
    var Timer = xdc.useModule('ti.sysbios.hal.Timer');
    var timerParams = new TimerParams();
    timerParams.startMode = XDC.module ("ti.sysbios.interfaces.ITimer").StartMode_USER;
    timerParams.runMode = Timer.RunMode_Continuous;
    timerParams.Period = 1000000;timerParams.startTimer.Program.myTimer.Timer.Timer.startTimer.Timer.Timer.Timer1
    = myTimer.Create "&myTimerFunc"、timerParams);
    
    var swParams = new swi.Params ();
    swiParams.arg0 = 1;
    swiParams.arg1 = 0;
    swiParams.priority = 2;
    swiParams.trigger = 0;
    program.global.sw0 = Swi.create ('&swi0Fxn'、swiParams);
    
    var hwi0Params = new Hwi.Params ();
    hwi0Params.instance.name ="adcHwi";
    Program.global.adcHwi = Hwi.create (16、"&Hwi_ADC"、hwi0Params);
    /var GIC_Hwi = xdc.useModule('ti.sysbios.family.arm.gic.Hwi');
    //var ti_sysbios_family_arm_A8_intcps_Hwi = xdc.useModule('ti.sysbios.family.arm.a8.intcps.Hwi');
    
    var Cache = xdc.useModule('ti.sysbios.family.arm.a8.Cache')
    
    var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    //var Timestamp = xdc.useModule('xdc.runtime.Timestamp');//如果
    
    
    
    
    
    在应用程序中使用 Semestamp_get32、则启用/var/GateMU = xdc.useModule('ti.sysbios.gates.GateAll'); xdc.useModule('ti.sysbios.family.arm.arm9.Mmu'); var MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu'); xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');/ var hostMMU = xdc.useModule('ti.sysbios.family.a9.Mmu');/启用
    /*
    Program.argSize 设置.args 段的大小。
    *示例不使用命令行参数,因此 argSize 设置为0。
    /Program.argSize
    = 0x0;
    
    var socType ="AM335x";
    var CSl = xdc.useModule('ti.csl.Settings');
    Csl.deviceType = socType;
    
    //加载 OSAL 包*/
    var osType ="tirtos";
    //var osType ="nonos";
    var OSAL = xdc.loadPackage ('ti.osal');
    OSAL.Settings.osType = osType;
    OSAL.Settings.socType= socType;
    OSAL.Settings.libProfile ="Debug";
    
    //加载 UART 包*/
    var UART = xdc.loadPackage ('ti.drv.UART');
    UART.Settings.socType = socType;
    UART.Settings.libProfile ="Debug";
    
    //加载 SPI 包*/
    var socType ="AM335x";
    var I2C = xdc.loadPackage ('ti.drv.i2c');
    I2C.Settings.socType = socType;
    I2C.Settings.libProfile ="Debug";
    //加载电路板封装*
    / var Board = xdc.loadPackage ('ti.board');
    
    Board.Settings.boardName ="SAM335x";
    Board.Settings.loadPackage.libProfile ="var'tude";board.us.us.us.out.debug";
    
    var'sUSB = ti.drv.usb');
    //usb.Settings.libProfile ="调试";
    
    var usbSettings = xdc.useModule('ti.drv.usb.Settings');
    usbSettings.socType ="AM335x";
    
    /* fat 文件系统*
    / var Fatfs = XDC.loadPackage ('ti.fs.fatfs');
    Fatfs.Settings.libProfile ="调试";
    /*
    取消注释此行以全局禁用断言。
    *所有模块继承'库'模块的默认值。 您
    *可以使用 Module.common$按模块覆盖这些默认值。
    *禁用断言将节省代码空间并提高运行时性能。
    Defaults.common$.diags_ASSERT = Diags.always_off;
    */
    Defaults.common$.diags_ASSERT = Diags.always_off;
    
    
    //
    取消注释此行以防止模块名称加载到目标上。
    *模块名称字符串放置在.const 段中。 将此
    *参数设置为 false 将节省.const 段中的空间。 错误和
    *断言消息将包含"未知模块"前缀、而
    不是*实际模块名称。
    Defaults.common$.namedModule = false;
    */
    Defaults.common$.namedModule = false;
    
    /*
    最小化系统中的退出处理程序数组。 System 模块包括
    *一组函数,这些函数在 System_atexit()中注册,
    *由 System_exit()调用。
    //
    System.maxAtexitHandlers = 4;
    
    //
    *取消注释此行以禁用 Error print 函数。
    *禁用时,我们会丢失错误信息,因为
    *不打印错误。 如果
    *由于 Error_print()函数
    *调用 System_printf(),禁用 raiseHook 将节省一些代码空间。
    error.raiseHook =空;
    */
    //Error.raiseHook =空;
    //
    *取消注释此行以防止错误、断言和日志字符串
    *加载到目标上。 这些字符串放置在.const 段中。
    *将此参数设置为 false 将节省.const 段中的空间。
    *错误、断言和日志消息将打印原始 ID 和 args、而不是
    *格式化的消息。
    text.isLoaded = false;
    */
    text.isLoaded = false;
    /*
    取消注释此行以禁用
    程序退出时 SysMin *输出的字符。 SysMin 向循环缓冲区写入字符。
    *可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
    //
    SysMin.flushAtExit = false;
    
    
    //
    * BIOS 模块将为系统创建默认堆。
    *指定此默认堆的大小。
    //
    bios.heapSize = 32000;
    
    //系统堆栈大小(由 ISR 和 Swi 使用)*/
    Program.stack = 0x4000;
    
    
    //
    *为整个系统创建并安装记录器
    *//
    var logerBufParams = new Loggerf.Params ();
    //loggerBufParams.numEncogerags = 16;
    // var LoggerBuf.Params
    
    Main.common$.diags_INFO = 0;
    
    
    Swi.common$.namedInstance // Defaults.common$.logger = 0/ loggerBudogerf.Params = 0;/loggerf.out = 0;/loggerBudogerf.rums = tres = 0;//始终为
    BIOS.libType = BIOS.LibType_Custom;
    BIOS.assertsEnabled = false;
    //Program.sectionsExclude =".*";//此行不推荐会禁用 ROV
    
    
    /*var Agent = xdc.useModule('ti.sysbios.rta.Agent');
    Agent.sysbiosHwiLogging = true;
    Agent.SwiBiosLogging = false;
    Agent.sysbiosTaskLoggingRuntimeControl = false;
    Agent.sysbiosLoggerSize = 35000;
    agent.loadLogging = false;
    Agent.loadLoggingRuntimeControl = false;
    Agent.mainLogging = false;
    Agent.mainLoggingRuntimeControl = false;
    BIOS.logsEnabled = true;*/
    
    Clock.tickPeriod = 1000;
    Hwi.patcherLogging Support = true;Hwi.SwitcherTaskSupport
    = true;Hwi.AutoTimeStoning=
    true
    ;Hwi.initStackFlag = true;调度/调度
    //Hwi.checkStackFlag = false;
    BIOS.logsEnabled = false;
    //BIOS.runtimeCreatesEnabled = false;
    BIOS.swiEnabled = true;
    Task.enableIdleTask = false;
    Task.initStackFlag = false;
    Task.checkStackFlag = false;
    //bios.cpufreq.lo = 600000000;
    //cache.configureL2Sram = false;//DDR Build
    //cache.enableCache = false;//需要启用高速缓存以便 AM335 USB 项目工作
    
    
    MMU。enableMMU = true;
    
    //强制外设段不可高速缓存
    {var = peripheralsand-trauled 内存
    键入:MMU.FirstLevelDesc_section,//段描述符
    TEX:0、
    可缓冲:false, //可缓冲
    可高速缓冲:false, //可缓存
    可共享:false, //可共享
    NoExecute:true, //不可执行
    };
    
    //定义1Meg 页的基址
    //外设驻留在中。
    var peripheralBaseAddr = 0x44e00400;
    
    //相应地配置相应的 MMU 页描述符
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);
    
    
    //定义1Meg 页的基地址
    //外设驻留在中。
    /var peripheralBaseAddr = 0x481a6000;// UART3和其他
    
    //相应地配置相应的 MMU 页描述符
    // Mmu.setFirstLevelDescMeta(peripheralBaseAddr,
    // peripheralBaseAddr、
    // peripheralAttrs);
    
    VAR peripheralBaseAddr = 0x44E09000;// UART0和其他
    //相应地配置相应的 MMU 页描述
    符 Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);
    
    VAR peripheralBaseAddr = 0x48022000;// UART1和其他
    //相应地配置相应的 MMU 页描述
    符 Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);
    var peripheralBaseAddr = 0x48024000;// UART2和其他
    //相应地配置相应的 MMU 页描述
    符 Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);
    VAR peripheralBaseAddr = 0x481A8000;// UART4和其他
    //相应地配置 MMU 页描述
    符 Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);
    
    var peripheralBaseAddr = 0x47400000;// USBSS
    
    //相应地配置相应的 MMU 页描述
    符 Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);
    
    VAR peripheralBaseAddr = 0x48040000;// DMTimer2-7
    
    //相应地配置相应的 MMU 页描述
    符 Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);
    
    
    //在 app_uncached_data_blk3_MEM
    var peripheralBaseAddr = 0xA0000000处配置 MMU 页;// app_uncached_data_blk3_MEM
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr,
    peripheralBaseAddr、
    peripheralAttrs);
    
    
    Program.sectMap[".bss:extMemCache:ramdisk"] = new Program.SectionSpec ();
    Program.sectMap[".bss:extMemCache:ramdisk"].loadSegment ="app_cached_data_BLK2_MEM";
    Program.sectMap[".bss:extMemCache:ramdisk"].type ="空载";
    
    
    
    

    --------------------------------------------------------------------

    请帮助检查,并告诉我是否有任何建议。  非常感谢!



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉耽误你的时间。 这是否得到了解决?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是, 已经解决了。  因为 HWI 被其他模块意外禁用

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