uclinux-2008R1.5-RC3(bf561)到VDSP5的移植(71):l1_data_sram_init的疑惑

快乐虾

http://blog.csdn.net/lights_joy/

lights@hb165.com

  

本文适用于

ADI bf561 DSP

优视BF561EVB开发板

uclinux-2008r1.5-rc3(smp patch)

Visual DSP++ 5.0(update 5)

  

欢迎转载,但请保留作者信息

 

在内核初始化的时候,会调用l1_data_sram_init函数,这个函数将登记L1 data bank中的可用空间。

void __init l1_data_sram_init(void)

{

     unsigned int cpu;

 

#if L1_DATA_A_LENGTH != 0

     printk(KERN_INFO "Blackfin DATA_A SRAM: %d KB/n",

              L1_DATA_A_LENGTH >> 10);

     for (cpu = 0; cpu < NR_CPUS; ++cpu) {

         memset(&per_cpu(l1sram, cpu).l1_data_A_sram, 0x00,

                sizeof(per_cpu(l1sram, cpu).l1_data_A_sram));

         per_cpu(l1sram, cpu).l1_data_A_sram[0].paddr = (void *)get_l1_data_a_start_cpu(cpu) +

              0x2000/*(_ebss_l1 - _sdata_l1)*/;

         per_cpu(l1sram, cpu).l1_data_A_sram[0].size = L1_DATA_A_LENGTH - 0x2000/*(_ebss_l1 - _sdata_l1)*/;

         per_cpu(l1sram, cpu).l1_data_A_sram[0].flag = SRAM_SLT_FREE;

     }

#endif

#if L1_DATA_B_LENGTH != 0

     printk(KERN_INFO "Blackfin DATA_B SRAM: %d KB/n",

         L1_DATA_B_LENGTH >> 10);

     for (cpu = 0; cpu < NR_CPUS; ++cpu) {

         memset(&per_cpu(l1sram, cpu).l1_data_B_sram, 0x00, sizeof(per_cpu(l1sram, cpu).l1_data_B_sram));

         per_cpu(l1sram, cpu).l1_data_B_sram[0].paddr = (void *)get_l1_data_b_start_cpu(cpu)+0x2000/*(_ebss_b_l1 - _sdata_b_l1)*/;

         per_cpu(l1sram, cpu).l1_data_B_sram[0].size = L1_DATA_B_LENGTH-0x2000/*(_ebss_b_l1 - _sdata_b_l1)*/;

         per_cpu(l1sram, cpu).l1_data_B_sram[0].flag = SRAM_SLT_FREE;

     }

#endif

     /* mutex initialize */

     spin_lock_init(&per_cpu(l1sram, cpu).l1_data_sram_lock);

}

但是到了最后一行

     spin_lock_init(&per_cpu(l1sram, cpu).l1_data_sram_lock);

这个时候,很明显cpu这个变量的值为2。

看看per_cpu的定义:

#define per_cpu(var, cpu) (*({                 /

     extern int simple_identifier_##var(void); /

     RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]); }))

它要引用一个全局变量:__per_cpu_offset[cpu]

那么这个变量是怎么定义的呢?

unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;

这里NR_CPUS的值为2!也就是说对__per_cpu_offset[2]的引用是非法的。

 

1       参考资料

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(65)B核启动(2009-2-13)

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(66)_ebss_l1(2009-02-13)

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(67)li1240(2009-2-14)

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(68)PLL配置(2009-02-16)

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值