【问题标题】:Conversion of old init_timer in new linux kernel在新的 linux 内核中转换旧的 init_timer
【发布时间】:2019-06-05 18:18:54
【问题描述】:

我正在尝试构建 SDK 驱动程序(没有制造商提供的文档或支持)。原始驱动程序使用 init_timer() 并传入一个指向 timer_list 结构的指针。它使用“数据”元素。现在我知道一些计时器功能在较新的 Linux 内核中已被弃用。目前我使用的是内核版本 4.15。

访问“数据”元素的最佳方式是什么?

当前函数如下所示 -

OS_RESULT OS_TimerCreate(OS_DRV_CONTEXT* aContext, OS_TIMER* aTimer, OS_UINT32 aPeriodic, OS_TIMER_FNC aFunction, 
            OS_VOID* aData, OS_UINT32 aPeriod)
{
    struct timer_list* lTimer = (struct timer_list*) aTimer->Space;
    unsigned long lJiffies = jiffies;
    unsigned long lPeriod = msecs_to_jiffies(aPeriod);

    OS_UNREFERENCED_PARAMETER(aContext);
    OS_ASSERT( OS_TIMER_SIZE >= sizeof(timer_list));

    init_timer(lTimer);

    lTimer->expires = lJiffies + lPeriod;
    lTimer->data = (unsigned long) aTimer;
    aTimer->Function = aFunction;
    aTimer->Data = aData;   
    aTimer->Period = lPeriod;
    if (aPeriodic)
    {
        lTimer->function = OS_TimerPeriodicInternalFunc; 
    }
    else
    {
        lTimer->function = OS_TimerInternalFunc; 
    }

    add_timer(lTimer);

    return OS_RESULT_OK;
}

参考声明-

typedef struct
{
    OS_UINT8      Space[OS_TIMER_SIZE];
    OS_TIMER_FNC  Function;
    OS_VOID*      Data;
    OS_UINT32     Period;
} OS_TIMER;

OS_DECL_EXTERN OS_RESULT OS_TimerCreate(OS_DRV_CONTEXT* aContext, OS_TIMER* aTimer, OS_UINT32 aPeriodic, OS_TIMER_FNC aFunction, OS_VOID* aData, OS_UINT32 aPeriod /* ms */);

我们将不胜感激。

【问题讨论】:

  • 那么,您看过内核内部的任何转换示例吗?

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

您首先需要将存储struct timer_list 的成员更改为正确的类型,而不是使用字节数组:

typedef struct
{
    struct timer_list Timer;
    OS_TIMER_FNC  Function;
    OS_VOID*      Data;
    OS_UINT32     Period;
} OS_TIMER;

(而lTimer 只是设置为&aTimer->Timer)。

在旧代码中,data 成员只是设置为指向包含计时器的OS_TIMER 结构的指针。在新代码中,回调可以改为使用 from_timer 宏获取此指针,例如,如果在旧回调中你有这个:

OS_TIMER *aTimer = lTimer->data;

然后在新代码中你将拥有:

OS_TIMER *aTimer = from_timer(aTimer, lTimer, Timer);

(其中最后一个参数TimerOS_TIMERstruct timer_list 字段的名称)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多