gpt4 book ai didi

linux - 控制TI OMAP l138频率导致 "Division by zero in kernel"

转载 作者:太空狗 更新时间:2023-10-29 12:30:47 24 4
gpt4 key购买 nike

我的团队正在尝试控制德州仪器 OMAP l138 的频率。默认频率为 300 MHz,我们希望以“完整”的形式将其设置为 372 MHz:我们不仅希望将默认值更改为所需的值(或至少在启动时配置它),而且能够在运行时更改值。

在网络上搜索如何执行此操作时,我们找到了一篇文章,其中介绍了执行此操作的一种方法是通过“echo”命令:

echo 372000 /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

我们用这个命令做了一些测试,它运行良好,但有一个问题:有时第一次调用这个 echo 命令会导致错误消息“在内核中被零除”:

PrintScreen with error message

在我的个人测试中,这个错误总是出现在第一次调用 echo 命令时。所有后来的调用都没有错误。然后,如果我重置我的处理器并再次调用该命令,则会出现同样的问题:第一次调用导致此错误,之后的调用没有问题。

所以我的问题是:是什么导致了这个问题?我该如何解决呢? (显然答案“总是输入两次”不算数!)

(请随意提及实时控制 OMAP l138 频率的其他方法!)

最佳答案

在我看来,您在 davinci_spi_cpufreq_transition() 函数中被零除。在此函数的某处(或在 davinci_spi_cpufreq_transition 中调用的某些函数中)有一个错误的除法运算,它试图除以某个变量(在您的情况下)的值为 0。这是显然应该在代码中正确处理的错误情况,但实际上并非如此。

很难说到底是哪段代码导致了这个,因为我不知道你使用的是哪个内核。如果您可以提供指向您的内核存储库的链接,那将会容易得多。虽然我在上游内核中找不到davinci_spi_cpufreq_transition,但我找到了here .

davinci_spi_cpufreq_transition() 函数似乎在 drivers/spi/davinci_spi.c 中.它调用davinci_spi_calc_clk_div() function .那里有2个部门。首先是:

prescale = ((clk_rate / hz) - 1);

第二个是:

if (hz < (clk_rate / (prescale + 1)))

其中一个可能导致“被零除”错误。我建议您通过以下方式修改 davinci_spi_calc_clk_div() 函数来追踪是哪个(只需添加标记为“+”的行):

    static void davinci_spi_calc_clk_div(struct davinci_spi *davinci_spi)
{
struct davinci_spi_platform_data *pdata;
unsigned long clk_rate;
u32 hz, cs_num, prescale;

pdata = davinci_spi->pdata;
cs_num = davinci_spi->cs_num;
hz = davinci_spi->speed;
clk_rate = clk_get_rate(davinci_spi->clk);
+ printk(KERN_ERR "### hz = %u\n", hz);
prescale = ((clk_rate / hz) - 1);
if (prescale > 0xff)
prescale = 0xff;

+ printk("### prescale + 1 = %u\n", prescale + 1UL);
if (hz < (clk_rate / (prescale + 1)))
prescale++;

if (prescale < 2) {
pr_info("davinci SPI controller min. prescale value is 2\n");
prescale = 2;
}

clear_fmt_bits(davinci_spi->base, 0x0000ff00, cs_num);
set_fmt_bits(davinci_spi->base, prescale << 8, cs_num);
}

我的猜测——它是“hz”变量,在您的情况下为 0。如果是这样,您可能还想将下一个调试行添加到 davinci_spi_setup_transfer() 函数:

        if (!hz)
hz = spi->max_speed_hz;

+ printk(KERN_ERR "### setup_transfer: setting speed to %u\n", hz);
davinci_spi->speed = hz;
davinci_spi->cs_num = spi->chip_select;

完成所有这些修改后,重新构建内核,您可能会明白为什么会出现“除以零”错误。只需在内核引导日志中查找以“###”开头的行。如果您不知道下一步该做什么——附上这些调试行,我会尽力帮助您。

关于linux - 控制TI OMAP l138频率导致 "Division by zero in kernel",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27783606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com