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/AM3358: Clock tick source

Part Number: AM3358
Other Parts Discussed in Thread: SYSBIOS

Tool/software: TI-RTOS

As SYSBIOS is open sourced, but I can't find the source code of ti_sysbios_knl_Clock_doTickFunc__C, would you please help me to allocate it?

Clock_tick()->ti_sysbios_knl_Clock_doTickFunc__C

/* doTickFunc */

#define ti_sysbios_knl_Clock_doTickFunc (ti_sysbios_knl_Clock_doTickFunc__C)

typedef xdc_Void (*CT__ti_sysbios_knl_Clock_doTickFunc)(xdc_UArg);

__extern __FAR__ const CT__ti_sysbios_knl_Clock_doTickFunc ti_sysbios_knl_Clock_doTickFunc__C;

 

/* triggerClock */

#define ti_sysbios_knl_Clock_triggerClock (ti_sysbios_knl_Clock_triggerClock__C)

typedef ti_sysbios_knl_Clock_Handle CT__ti_sysbios_knl_Clock_triggerClock;

__extern __FAR__ const CT__ti_sysbios_knl_Clock_triggerClock ti_sysbios_knl_Clock_triggerClock__C;

  • Hi Tony,

    ti_sysbios_knl_Clock_doTick__I() is a generated function. It is specified in the <BIOS_install_dir>\packages\ti\sysbios\knl\Clock.xdt file. This file is basically JavaScript that gets builds the ti_sysbios_knl_Clock_doTick__I() during the build and places it in the generated big .c (e.g. in the project's \Debug\configPkg\package\cfg\<cfgname>_<target>.c file. For example, here is a snippet of the .xdt ('t' means template). The '%' means JavaScript code

    Void ti_sysbios_knl_Clock_doTick__I(UArg arg)
    {
    %if (Clock.tickMode == Clock.TickMode_PERIODIC) {
    /* update system time */
    `mobj`->ticks++;

    %}
    ti_sysbios_knl_Clock_logTick__E();

    %if (Clock.tickMode == Clock.TickMode_DYNAMIC) {
    {
    %}
    %else {
    if (!ti_sysbios_knl_Queue_empty(ti_sysbios_knl_Clock_Module_State_clockQ())) {
    `mobj`->swiCount++;

    %}
    %if (BIOS.swiEnabled == true) {
    ti_sysbios_knl_Swi_post(`mobj`->swi);
    %}
    %else {
    % if (Clock.tickMode == Clock.TickMode_DYNAMIC) {
    ti_sysbios_knl_Clock_workFuncDynamic__E(0, 0);
    % }
    % else {
    ti_sysbios_knl_Clock_workFunc__E(0, 0);
    % }
    %}
    }
    }
    %} /* BIOS.clockEnabled */

    For an example I built, I got the following in the big .c

    Void ti_sysbios_knl_Clock_doTick__I(UArg arg)
    {
    /* update system time */
    (&ti_sysbios_knl_Clock_Module__state__V)->ticks++;

    ti_sysbios_knl_Clock_logTick__E();

    if (!ti_sysbios_knl_Queue_empty(ti_sysbios_knl_Clock_Module_State_clockQ())) {
    (&ti_sysbios_knl_Clock_Module__state__V)->swiCount++;

    ti_sysbios_knl_Swi_post((&ti_sysbios_knl_Clock_Module__state__V)->swi);
    }
    }

    Most of the time ti_sysbios_knl_Clock_doTick__I is plugged into ti_sysbios_knl_Clock_doTickFunc__C (which is also Clock_doTickFunc). It is not if the user does not want the kernel to drive the tick (e.g. Clock.tickSource = Clock.TickSource_USER;)

    Why do we do this? It allows us to optimize the function based on the configuration. The optimization is both speed and footprint.

    Todd