第二十八篇: 学习笔记

最近一直在学一些零零碎碎的东西,

首先,将《鸟哥的 Linux 私房菜
-- 基础学习篇
》过了一遍。

因为有了Windows驱动,PCI/PCIe, USB, xHCI, Windows内核编程的基础,

加上自己以前也动手写过Linux设备驱动, 研究过Makefile, KConfig, make menuconfig, GIT的部分内容

鸟哥的这本书确实写得非常通俗易懂,帮我解开了一些以前知道怎么操作, 但不知道为什么要这样操作的疑惑。

另外,基本完成了USB Audio/Video Class设备端的:裸金属代码与Linux驱动代码。

USB xHCI主机端的Windows WDDM驱动,与Linux的DRM/KMS 驱动还在有条不紊地行进中与优化中。

通过这个项目,

技术上:

USB Audio/Video Class

HDMI

DDR memory controller

LCD controller

VESA/CEA-861-D

I2S, I2C

SoC: Cache(D/I cache, L2 cache & Internal SRAM), CP15, MMU

Linux driver/module

等有了更进一步的深入理解

比起以前负责的项目(avstream/bda driver, cypress fx2 firmware, usb audio class, usb video class), usb audio/video class项目不仅从技术上得到了加强与锻炼,同时也在一线技术管理,项目安排,规划方面,外部交流中得到了一定的锻炼。

另外,最近也研究了一下:

arm的vector.s, init.s, scatter loading(xxx_ld.script, 在Eclipse的项目,属性,ARM RealView Linker, Output, Scatter Description File --scatter= 设置).

arm从0地址开始执行,首先运行的是:

Reset_handler(init.s) (LDR     PC, Reset_addr),在其中做了一些硬件初始化后(比如,MMU开关, I/D CACHE开关, 异常向量在高/低端的设置, SoC内部的SRAM是用作L2 CACHE还是SRAM的设置)

各个模式(例如SVC, IRQ, FIQ, ABT, UND, SYS/USER)的准备(主要是STACK的基地址设置)

以上设置部分需要涉及到CP15的读写。

之后,PC就跳转到__main (不是main).

然后,PC跳到__scatterload (包括 __scatterload_r, __scatterload_n(__scatterload_n就是__scatterload_null))

之后,运行__decompress (__scatterload_null 调用了__decompress)

之后,运行__scatterload_z (zero init)

之后,运行__rt_entry

{

__rt_stackheap_init

__user_setup_stackheap

__rt_stackheap_storage

__platform_post_stackheap_init

__fp_init

__rt_fp_status_addr

__ARM_argv_veneer

__heap_extend

__rt_heap_extend

__rt_heap_descriptor

__heap_guard

__heap_provide_memory

__init_alloc

srand

__rand_init

__aeabi_memclr4

__memset_w

__mutex_initialize

__sys_open

似乎并没有全部列出来

}

最后,才开始执行main (c代码中的main)

总结一下:

_main()引导库函数完成C执行环境的初始化,具体过程如下:

◇将非启动代码的RO和RW执行域代码从加载域地址复制到执行域地址;

◇将ZI域清零;

◇跳转到_rt_entry。

_main()并没有建立C库运行必须的环境,这项工作由_rt_entry()完成,主要调用过程为:

◇调用_rt_stackheap_init()建立堆和栈;

◇调用_rt_lib_init()初始化引用的库函数;假如需要,建立main()函数的参数argc和argv等;(似乎我没跟踪到_rt_lib_init(),
但是看到了strlen,难道这就是在调用?

◇调用main()函数,执行应用程式,能够应用库函数;

◇用main()函数的返回值作参数调用exit()。 

在ADS1.2的环境中,如果在C入口没有调用编译器的链接库(__main),那么在C程序一开始要调用该函数以初始化运行时的函数库,以保证对ADS提供的某些库函数能够正常调用。从这个函数开始,我们已经在C语言环境下了。

时间: 2024-08-13 13:56:59

第二十八篇: 学习笔记的相关文章

Egret入门学习日记 --- 第二十八篇(书中 9.19 ~ 9.19 节 内容)

第二十八篇(书中 9.19 节 内容) 没想到第九章的组件篇可真是够长的,没事,慢慢来吧. 开始 9.19节. 重点: 1.创建一个Tips提示组件. 操作: 1.创建一个Tips提示组件. 哇!出大问题!这个Tips组件有点牛皮!怎么办? 书中内容这部分,我直接懵逼. 还有这部分也是. 一点一点来分析好吧. 好,开始分析一波. 第一步:查看最终展示效果. 这是最终效果.(我去,我现在才知道,原来博客园的编辑器还可以放Gif图片...) 第二步:这个黑色的弹框组件本质上是由什么构成的? 可见,在

第二十八篇:SOUI中自定义控件开发过程

在SOUI中已经提供了大部分常用的控件,但是内置控件不可能满足用户的所有要求,因此一个真实的应用少不得还要做一些自定义控件. 学习一个新东西,最简单的办法就是依葫芦画瓢.事实上在SOUI系统中内置控件和自定义控件的开发流程是完全一样的,因此只需要打开SOUI的源代码,随便找一个控件看一下就大体差不多了. 下面我以controls.extend目录下的的SRadioBox2控件为例对控件开发过程需要注意的地方做一点说明. 要开发一个控件,首先要确定的是应该从哪个控件来继承.选择一个合适的基类是正确

第二十八篇 静态属性、类方法、静态方法

静态属性 静态属性:实际上说的就是数据属性 需求:每个人都有自己的房子,想知道每个人自己的房子都有多大平米 实现分析:每个人,表示有很多人,不可能一个人写一次计算面积的方法,那么就可以将它提炼出来,放到类里 class Room: tag=1 def __init__(self,name,owner,width,length,heigh): self.name=name self.owner=owner self.width=width self.length=length self.heigh

Python之路【第二十八篇】:django视图层、模块层

1.视图函数 文件在view_demo 一个视图函数简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以.无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你的Python目录下面.除此之外没有更多的要求了——可以说“没有什么神奇的地方”.为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中. 视图

小刘同学的第二十八篇博文

今天状态不是很好,不知道怎么的,坐在椅子都感觉很难受,难得晚上吃的麻辣香锅有毒? 特别难受,一阵阵的恶心,强打起精神来,把16次课的最后一道逻辑题写完了,其实这个挺简单的,不过没思考,很简单的用了很多ifififif-- 应该可以少用点if,逻辑应该会更好看一点,实在是头晕恶心,就没多想,写完了就行吧-- <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"

我的第二十八篇博客---seleinum

from selenium import webdriver #初始化驱动driver=webdriver.Chrome()#请求页面driver.get(url='https://www.baidu.com')#找到对应标签,发送文本driver.find_element_by_xpath("//*[@id='kw']").send_keys('2019') #找到按钮,点击clickdriver.find_element_by_xpath("//*[@id='su']&q

开始写游戏 --- 第二十八篇

今天: 1.添加:物品奖励组件 2.添加:物品信息弹框组件 3.碰到BUG,现在被卡住了 上图: 1.添加:物品奖励组件 { 效果: 代码: } 2.添加:物品信息弹框组件 { 效果: 代码: 要使用这个组件的话,还要搭配一个数据转换类: } 3.碰到BUG,现在被卡住了 { 可以看到,物品信息组件显示位置出现问题. 这个FGUI官方群,现在都没有给具体的解决方案. 这是在FGUI编辑器中的效果: 这是游戏运行的效果: 为了证明是同一个组件,我特意换了一下颜色: 可见,现在这种情况...我真的有

Egret入门学习日记 --- 第二十四篇(书中 9.12~9.15 节 内容)

第二十四篇(书中 9.12~9.15 节 内容) 开始 9.12节 内容. 重点: 1.TextInput的使用,以及如何设置加密属性. 操作: 1.TextInput的使用,以及如何设置加密属性. 创建exml文件,拖入组件,设置好id. 这是显示密码星号处理的属性. 创建绑定类. 实例化,并运行. 但是焦点在密码输入框时,密码是显示的. 暂时不知道怎么设置 “焦点在密码框上时,还是显示为 * 号” 的方法. 至此,9.12节 内容结束. 开始 9.13节 . 这个,和TextInput的使用

Egret入门学习日记 --- 第二十二篇(书中 9.7~9.8 节 内容)

第二十二篇(书中 9.7~9.8 节 内容) 开始 9.7节 内容. 重点: 1.进度条ProgressBar的声明和使用. 操作: 1.进度条ProgressBar的声明和使用. 现在真的轻车熟路了,很简单.无非就是设置一下最大值,当前值的属性. 然后,事件监听的话,也是一样的.只不过事件名字的话,我就选书中这个事件吧. 可惜不能发动图,不然你们就可以看到这个进度条,每帧+1的速度前进. 当然,如果你想换自定义皮肤,还是老规矩,去找默认的 EXML 文件. 然后,怎么换素材,就按照自己喜欢的换