STM32F103 ucLinux内核没有完全启动

从BOOT跳转到内核后,执行一长段的汇编语言,然后来到startkernel函数,开启C语言之旅。

但是内核输出不正常,如下所示:

Linux version 2.6.26-uc0 (stm32@localhost.localdomain) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-163) ) #2 Wed Sep 2 10:09:23 UTC 2009
CPU: ARMv7-M Processor [411fc231] revision 1 (ARMv?(11)M)
Machine: STM3210E-EVAL
Warning: bad configuration page, trying to continue
SRAM Config: bank[0] @ 0x68000000 (size: 1024KB) - bank[1] @ 0x20000000 (size: 64KB).
Ignoring unrecognised tag 0x00000000
Built 1 zonelists in Zone order, mobility grouping off. Total pages: 254
Kernel command line:
PID hash table entries: 16 (order: 4, 64 bytes)
console [ttyS0] enabled
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Bad page state in process 'swapper'
page:68901180 flags:0x2f55030e mapping:00000000 mapcount:0 count:0
Trying to fix it up, but a reboot is needed
Backtrace:
Bad page state in process 'swapper'
page:689011c0 flags:0x08a8420a mapping:00000000 mapcount:0 count:134218033
Trying to fix it up, but a reboot is needed
Backtrace:
Bad page state in process 'swapper'
page:689011c0 flags:0x08a8420a mapping:00000000 mapcount:0 count:134218033
Trying to fix it up, but a reboot is needed
Backtrace:
Bad page state in process 'swapper'
page:689011e0 flags:0x2eb8430e mapping:00000000 mapcount:0 count:134218033
Trying to fix it up, but a reboot is needed
Backtrace:
Bad page state in process 'swapper'
page:689011e0 flags:0x2eb8430e mapping:00000000 mapcount:0 count:134218033
Trying to fix it up, but a reboot is needed
Backtrace:
Bad page state in process 'swapper'
page:68901200 flags:0x0185000c mapping:00000000 mapcount:0 count:0
Trying to fix it up, but a reboot is needed
Backtrace:
CPU: 0 Tainted: G B (2.6.26-uc0 #2)
pc : [<08039bc2>] lr : [<08039cb1>] psr: 0100000b
sp : 20001f50 ip : 00000000 fp : 68901000
r10: 2000c28c r9 : 00000006 r8 : 00900000
r7 : 00000000 r6 : 00020000 r5 : 0c955a82 r4 : 68901220
r3 : 2984a715 r2 : ffffffff r1 : 9e375c8e r0 : 689
01220

跟踪调试内核,发现在mem_init→ free_all_bootmem_node→  free_all_bootmem_core→  __free_pages_bootmem→ __free_page→ __free_pages

→free_hot_page→ free_hot_cold_page→ free_pages_check→ bad_page

在bad_pages函数最终输出了下面的信息

Bad page state in process 'swapper'
page:68901180 flags:0x2f55030e mapping:00000000 mapcount:0 count:0
Trying to fix it up, but a reboot is needed
Backtrace:

而导致上面的原因是在free_all_bootmem_core函数中

pfn_to_page→ __pfn_to_page(根据推断是它,但看编译又不是)

#define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET))
#define ARCH_PFN_OFFSET PHYS_PFN_OFFSET
#define PHYS_PFN_OFFSET (PHYS_OFFSET >> PAGE_SHIFT)
#define PHYS_OFFSET (CONFIG_DRAM_BASE)
#define CONFIG_DRAM_BASE 0x20000000

struct page *mem_map,page结构体占用32个字节,mem_map的地址是0x6800 0000,ARCH_PFN_OFFSET根据上面的推算为2000 0

若pfn是6800 0,则内存0x6800 0000对应的页管理地址是

0x6800 0000 +(6800 0-2000 0)*32 = 6890 0000

而6890 0000这个地址实际是不存在的。

综上所述,很奇怪ST官网上的开发板可以正常运行。

我做了如下尝试:

1、将官网上的BOOT、内核下载到自己的设备上,串口输出乱码。原因是官网上是无源的8M晶振,而我们使用的是有源的11.0592M,

这样根据BOOT配置,系统主频变成了99M,但是串口的波特率应该不会改变啊,输出却是乱码,试了几个波特率都不对。

2、内核中,在调用控制台初始化时,我对串口1重新配置,修改它的波特率,仍然不起作用,输出乱码。

3、更换晶振,但是手边没有8M有源的,无源又需要电容搭接电路等,现在暂时没有试验出来。

STM32F103 ucLinux开发之三(内核启动后不正常)(完结)的更多相关文章

  1. STM32F103 ucLinux开发之四(内核启动后的调试)

    Stm32-uclinux启动后的调试 1.  修改__pfn_to_page使得能够启动 根据STM32F103 ucLinux开发之三(内核启动后不正常)的描述,内核无法启动是选择了平板内存模式后 ...

  2. STM32F103 ucLinux开发BOOT

    STM32F103 ucLinux开发BOOT STM3210E-EVAL官方开发板主芯片STM32F103ZET6: 片内512K Flash,地址0x0800 0000 ~ 0x0807 FFFF ...

  3. STM32F103 ucLinux开发之一(BOOT分析及源码)

    STM32F103 ucLinux开发BOOT STM3210E-EVAL官方开发板主芯片STM32F103ZET6: 片内512K Flash,地址0x0800 0000 ~ 0x0807 FFFF ...

  4. 通过JTAG对比内核启动后text/rodata段内容

    关键词:vmlinux.strip.dump._text.__end_rodata等等. 在日常的调试中,可能会在某些情况下踩到内核重要的数据,比如代码段或者rodata之类. 这种情况下,需要确认这 ...

  5. STM32F103 ucLinux开发之二(内核启动汇编代码分析)

    start_kernel之前的汇编代码分析 Boot中执行下面两句话之后,进入uclinux内核. theKernel = (void (*)(int, int, unsigned int))((ui ...

  6. linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转)

    linux是如何组成的?答:linux是由用户空间和内核空间组成的为什么要划分用户空间和内核空间?答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的安全性,比如X86 ...

  7. 自定义内核启动后的Logo

    1.使用图像GIMP工具   2.详细步骤如下:   A.将800x480的图片导入到GIMP工具.   B.选中GIMP菜单栏进行以下操作     图像         -->模式       ...

  8. 内核启动后,lcd显示logo失败

    针对-s5pv210,但对其他平台也使用 lcd显示logo失败,若显示成功默认的logo是一只企鹅,但是串口打印“Start display and show logo”,但是LCD屏没有显示    ...

  9. Stm32-uclinux启动后的调试

    Stm32-uclinux启动后的调试 1.  修改__pfn_to_page使得能够启动 根据STM32F103 ucLinux开发之三(内核启动后不正常)的描述,内核无法启动是选择了平板内存模式后 ...

随机推荐

  1. 用css动画写一个下红包雨的效果

    红包雨的功能相信大家都做过,不过一般都是用js计算的,闲着无聊用css的样式写了类似的,主要用的是css的transform和animation结合.大概代码逻辑: @keyframes startH ...

  2. 【echats】echats悬浮事件频繁触发、过于灵敏、快速抖动等异常现象,适用与tooltip有关

    方案:transitionDuration设为0: 如图,发现关闭tooltip后现象消失,猜测与tooltip有关. 经过仔细观察,鼠标在快速移动时tooltip会延迟移动,就是这个时间差,让鼠标悬 ...

  3. Windows安装ActiveMQ记录

    1.下载压缩包(activeMQ应用要基于jdk服务上,安装本软件时,最好已经安装了jdk并且配置好了环境变量) 下载5.12.2版本:http://activemq.apache.org/activ ...

  4. CSS属性之margin

    0.对自身可视宽度的影响 1>改变处于标准文档流中,未设置width值的block元素的可视宽度 在标准文档流中,对于没有设置宽度的block元素,当其具有内容或者设置高度后,其自身宽度为父元素 ...

  5. C语言——循环队列和链队列的基本运算

    // 循环队列#include <stdio.h> #include "SeqQue.h" // 循环队列的基本运算 /* const int maxsize = 20 ...

  6. C#关于Clone()方法的介绍

    日常啪啪啪代码的时候,常常遇到浅复制与深复制的问题,下面就自己经验写写,有问题请留言! 例如我有一个简单的类: class People { public int _age; public strin ...

  7. IEC62304开发过程框架

    软件开发计划的任务 制定整体软件开发计划 制定设计和开发计划 规划软件开发的工具.标准和方法(Class C) 制定软件集成和集成计划 制定软件验证计划 制定软件风险管理计划 制定配置管理计划 软件需 ...

  8. SqlServer数据库(可疑)的解决办法

    当数据库发生这种操作故障时,可以按如下操作步骤可解决此方法, 打开数据库里的Sql 查询编辑器窗口,运行以下的命令. // 1.使用指定值强制重新配置:(1.0表示为真假) sp_configure ...

  9. rabbitmq集群方案

    RabbitMQ的集群方案有以下几种: 1.普通的集群 exchange,buindling再所有的节点上都会保存一份,但是queue只会存储在其中的一个节点上,但是所有的节点都会存储一份queue的 ...

  10. 关于动态门户WEB博雅互动的源代码(HTML+CSS+javascript)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...