- 博客(58)
- 资源 (6)
- 收藏
- 关注
原创 6T-sram存储单元原理分析
6T指的是其由6个mosfet构成。M1-M4是存储单元,而M5-M6用于门控访问。可以看出M1-M2 和 M3-M4是一个对称的结构,这是两个反相门的循环链接,由两个反相门循环相连的存储单元存在两种稳定状态,0和1。使用WL来控制存储单元的门控访问,BL来进行存储单元的读写。读:拉高WL,从BL中读出位即可写:拉高WL,拉高或者拉低BL,由于BL的驱动能力比存储单元强
2015-08-16 22:06:09 18777 1
原创 焦耳小偷-Joule_thief原理分析
焦耳小偷电路可以榨干一节废旧干电池上的所有能量。通常1.5V的干电池用完之后还会有1V左右的电压,说明此时电池内还有能量,只不过内阻已经变的很大,输出电流很微弱,已经无法驱动一般的电路,此时就算直接接一个LED也无法将其点亮,焦耳小偷电路可以通过磁感线圈产生高频高压的脉冲电压,使LED导通。以下是原理分析:1. 电流从BJT基极流入,使BJT轻微导通,使得集电极产生电流,集电极端的线圈
2015-08-16 21:52:29 5852
原创 无稳态多谐振荡器分析
电路如上图所示当电源导通的一瞬间,C1和C2都会进行充电,C1充电方向为Vcc-LED1-R3-C1-Q2be-Gnd,C2充电方向为Vcc-LED2-R4-C2-R1be-Gnd,同时三极管Q1和Q2也必将处于导通状态,而且由于基极电流过大,两三极管都将会进入饱和状态。LED1 ON, LED2 OFF2. 由于Q1和Q2之间微小的差异,假设Q1先进入饱和状态,则Q1的Uce
2015-08-16 21:41:32 4553
原创 mosfet拾遗
1. N沟道mosfet由P型衬底和两个N型的区组成。分为栅极G,源极S,和漏极D。通常衬底B和源极S会连在一起(市面上买到的mosfet通常都是如此)。2. 工作原理1. Vgs = 0,没有导电沟道2. Vgs >= Vt时,产生导电沟道,此时源极和漏极之间若加有适当电压,电子将由源极流向漏极。3. 6T sram原理分析由两个反相门相连的存储单
2015-08-16 21:13:10 569
原创 三极管原理分析
这里有一篇文章已经讲解的很好了http://wenku.baidu.com/link?url=zOLw5B1aS2Rrfn4qlegvfdQHGoeZVUI8mGaJaSnLDre_U3PvDx_6YJHjJykB-IsFomNUE5hI-R2_uI3gUcB5q-6hGxmhmv8xKMyM8KjKhie我再做一些补充。
2015-02-25 22:18:45 1294 1
原创 吉他泛音分析
首先贴一张弦振动的公式:上图中n=1,2,3....从公式中可以看出1. 弦振动时会产生多个频率的音,当n=1的时候产生的音叫基音,当n=2,3,4...产生的音叫泛音,分别叫做第一泛音,第二泛音....2. 频率和弦长、弦的张力,单位长度的质量有关,而且频率和弦长是成反比的。所以拨弦之后,弦会分别做如下图的运动:图来自维基上面从上到下分别是基音,第一泛
2015-02-22 15:11:36 2620 3
原创 Cortex-M3笔记
寄存器:R0-R15R0-R12可作为通用寄存器随意使用。R13:作为栈指针,有两个栈指针,PSP和MSP,某一时刻只有一个可见,可以通过修改CONTROL寄存器来切换使用PSP或者MSP。R14:作为LR链接寄存器,存储函数返回地址R15:作为PC指针处理器的三种状态:1. 用户级线程2. 特权级线程3. 特权级别Handler处理器状态机转换如下图。
2015-02-22 14:34:10 589 3
原创 计算机通俗理解
计算机真的是人类发明出来最伟大的机器,短短几十年时间,它已经深刻的改变了人类的社会形态,生活方式,正如蒸汽机的发明,电的发明一样,他已经成为了我们生活中不可缺少的一部分。然而计算机的实质却十分简单,简单到能完成任意复杂的工作。以下是我个人对计算机结构中最为重要的几个概念:CPU,内存,中断的一些理解,做一个类比,不求细节,只求点到其本质。CPU:假设你有一个忠心耿耿的仆人,你说的任
2014-03-28 02:01:09 1171
原创 vim
vim中有两种模式:普通模式(Normal Mode)和插入模式(Insert Mode)。在普通模式下可以用命令来操作,插入模式就是直接输入字符了。默认进入的是普通模式,普通模式下按i可以进入插入模式,按esc再回到普通模式。vim的哲学是:尽量呆在普通模式,使用命令来完成各种重复的输入工作。0. 在vim中生存!按i进入插入模式进行编辑,用上下左右方向键移动光标,编辑结束后按[es
2014-03-07 22:34:06 752 1
原创 基本乐理总结
大家好,这是我的音乐学习过程中的对乐理的一些理解,分享给大家,希望能够帮助到一些初学者,我也是新手哈,有说的不对的地方还高手指正哦:)。我们就从最基本的概念:音乐,开始讨论,音乐是什么?这个问题一抛出,马上就会有一大帮专家、学者、艺术评论家出来开始叽里呱啦喋喋不休了..., 烦都烦死啦。但从咱理科生的角度来看,音乐其实就是声波。声波是波的一种,那我们都知道波有三个特性:
2014-02-19 20:39:07 3046
原创 vim 快捷键拾遗
vim 快捷键拾遗光标跳转gg/G : 跳到第一行/跳到最后一行 w/W : (word)跳到下一个单词开头/W表示以空格作为单词的分界 e/E : (end)跳到下一个单词末尾/E表示以空格作为单词的分界 b/B : (backward)跳到上一个单词开头/B表示以空格作为单词的分界 ge/gE : 跳到上一个单词的末尾/gE以空格作为单词分界
2014-02-19 20:30:30 685
原创 身份证号和ISBN号校验规则
最近在看《编码》这本书,里面谈到了多种编码方式,从摩尔斯电码到盲文,ASCII码,以及其设计原理。尤其提到,在编码中,校验位是保证数据完整性很重要的一个设计,我顺手学习了一下身份证号和图书中ISBN号中的校验位,并写了简单的测试代码。目前我们使用的18位的身份证号,和13位的ISBN号,他们的最后一个数字都是校验位,身份证的最后一位可能有0~10是一个数,而规定校验位只能有一位,所以用‘X
2014-01-15 22:15:02 1576 2
原创 x86键盘跑马灯
我一直痴迷于用代码来控制硬件执行各种动作,有一天我突然想到,是不是可以用电脑的键盘灯来做一个跑马灯呢?如果你读过linux0.11代码,我们就知道,linus已经把这段代码写好了,你不需要再去翻datasheet,配寄存器,使能置位。。。不停的凑。。。以下是一段让你的键盘灯做“跑马灯”运动的代码,代码很简单,但是很好玩!如果你手头有一个妹子,可以试试让它以摩尔斯电码,或者A
2014-01-14 22:15:31 5959 1
原创 GeekOS 中的文件系统
以下是构造出文件系统的主角可以看到主要有四个对象构造出了文件系统。以下是调用Read_Fully读取文件的分析。用户通过vfs接口Read_Fully读文件过程如下:1. 调用vfs的Open接口a. vfs的Open接口调用vfs的Do_Open接口b. Do_Open根据参数path,解开prefix,根据prefix返回挂载点对象mountPoin
2013-11-26 22:34:11 1065 3
原创 nim游戏的必胜策略
假设有n堆石子,每堆石子的个数分别如下a1, a2, a3, ... an定义nim-sum为a1^a2^a3...an 可以证明1. 若a1^a2^a3...an != 0则经过一次合法的移动之后必定可变成a1^a2....an = 0此时留下的局面为必胜。2. 若a1^a2^a3...an = 0则经过一次合法的移动,局面必定成为a1^a
2013-08-31 12:40:49 9302 2
原创 GeekOS中的线程切换
在GeekOS中有两个地方会发生线程切换1.中断函数中,当执行完中断例程Handle_Interrupt的时候,可能会进行一次线程切换。在Handle_Interrupt中,执行完中断函数后,CPU会检查抢占标志g_preemptionDisabled和调度标志g_needRschedule,若g_preemptionDisabled==0,g_needRsched
2013-07-19 15:54:12 1031
原创 GeekOS 中的进程同步方法
GeekOS采用了两种同步方法用来保护临界区:0. 关中断1. 互斥量关中断void Init_Screen(void){ bool iflag = Begin_Int_Atomic(); s_cons.row = s_cons.col = 0; s_cons.currentAttr = DEFAULT_ATTRIBUTE; Clear_Scree
2013-07-19 15:00:01 986
原创 linux-0.00源代码
linux-0.00很简单,两个进程task0,task1,task0打印A,task1打印B,在时钟中断中调度进程运行。据说后来linus丢失了这个最初的版本,这里是赵炯博士写的linux-0.00版本。我把代码上传到了csdn的资源里面,在这里下载。简单说一下,就两个文件,boot.s和head.s。head.s被编译成system模块boot.s编译出的MBR用于将编译出
2013-07-11 20:51:44 2667 6
原创 linus大神的二级指针
看到这段代码的时候,我眼前一亮,果然是大神。一般我们删除单向链表种的一个节点的时候都会这样写:typedef struct node{ struct node * next; ....} node;typedef bool (* remove_fn)(node const * v);// Remove all nodes from the supplied
2013-06-25 20:50:49 1574
原创 linux-0.11中进程睡眠函数sleep_on()解析
sleep_on()用于进程睡眠。其原型为void sleep_on(struct task_struct **p);比如某个资源是互斥的,当资源被某一个进程占用时,其他进程便无法访问此资源。假设资源结构为struct __xxx_resource{ struct resource *rs; struct
2013-06-23 20:59:42 6223 11
原创 grub 0.97 浅析
说明:grub分为stage1、stage1.5、stage2三部分,其中stage1.5是可选的。stage1/stage1.S:被编译成stage1,位于0号扇区(逻辑扇区号),即MBR。stage1的作用是将1号扇区的start载入到内存0x0000:0x8000处,然后跳到0x0000:0x8000处执行。stage2/start.S:被编译成s
2013-06-20 11:18:24 2719
原创 exec()与system()的区别
这应该算是老生长谈的问题了,在此做一个记录。执行exec()后,老的进程上下文将被exec出来的新的进程上下文覆盖,新进程代替原进程执行。执行system()后则相当于fork()出一个子进程,并等待此子进程执行完毕。请看如下程序以加深理解。/* rt.c */ int main(){ return 100;}#gcc rt.c -o rt/
2013-06-09 15:16:03 11488
原创 uIP TCP协议状态机
uIP是Adam Dunkels写的专为8位/16位平台上的TCP/IP协议栈。如果你和我一样,看过一些TCP/IP方面的理论书,但苦于没有一个简单易懂的TCP/IP代码实现,感觉总是有一层面纱笼罩着神秘的TCP/IP,恭喜你,这次有福了。uIP总共7千余行代码,核心代码2千不到,少的可以说“干瘪”,但是他却实现了很多基本的东西如arp,icmp,ip分片,TCP。看完这个再去看lin
2013-05-23 20:35:54 1217 1
原创 GeekOS 中的project1
project2要求解析一个elf文件并执行。解析elf很简单,只要读取出elf文件中的程序头即Program Headers。需要知道:1. 总共有几个Program Headers。2. 每个Program Headers在文件中和在内存中的起始地址和界限。3. 程序入口地址。project1的代码中已经给我们定义好了elf head 和program head
2013-01-31 19:27:03 4922 1
原创 GeekOS中的进程睡眠
看了GeekOS,才真正理解了进程睡眠是什么意思。在GeekOS中,有一个s_runQueue队列,队列上排的是所有的可运行进程。调度程序Idle会不断的调度s_runQueue中的进程执行,当然Idle它本身也在s_runQueue中。当Idle在s_runQueue中选择了某个进程执行的时候,首先将它移出s_runQueue队列,然后切换到此进程执行。任
2013-01-25 22:32:28 903
原创 Geek OS 学习之pfat 文件系统
GeekOS中的pfat文件系统。结构如下。假设建立了一个10M的磁盘文件disk.img每个block为512B0 block :引导扇区1 block~n block: fat表,fat表中每个fat项存储的是一个块号,每个fat项4B,共可索引到0~2^32号块。fat表的大小根据磁盘文件而定,计算方式:(磁盘文件大小/512) * 4,fat表的作用是以链表的方式指示文
2013-01-22 12:44:07 1883
原创 xmame 模拟器分析0
重要的数据结构:数组cpuintrf_map[] 描述了所有类型的CPU结构。它包含一个cputype和一个cpu_get_info函数指针。cpuintrf[] 数组描述了每个CPU的接口。在初始化的时候会使用cpuintrf_map[]中的cpu_get_info来为cpuintrf[]数组初始化。在xmame_config_init()函数中会解析参数,比如输入$xm
2013-01-14 21:54:00 848 1
原创 段页式内存管理
在8086中由于cpu有20位的地址总线,可寻址2^20=1M内存,而内部寄存器只有16位寻址方式,所以intel设计了段:偏移的方式来寻址。段地址寄存器左移4位加上偏移即为物理地址。8086中不存在页的概念,所以这种方式直接的到了物理地址。把段:偏移称为逻辑地址。80X86中地址总线为32位,可寻址4G,80X86增加了保护模式,而它又由于需要兼容8086所以使用了分段和
2012-12-16 13:40:30 2136 1
原创 elf文件格式分析
各种讲解elf文件格式一上来就是各种数据类型,看了半天却不知道这些数据类型是干啥的,所以咱就先找个例子直接上手,这样对elf文件格式有个具体而生动的了解。然后再去看那些手册,就完全不惧了~。我们使用一个汇编程序max.s并对其进行编译链接产生的两个elf文件来对比分析elf文件。例子程序max.s来自《Linux C 一站式编程》。ps:这是一本看完可以真正可以深入理解C语言精华的
2012-06-12 22:04:14 22117 2
原创 Dijkstra算法
dijkstra算法过程问题:现已知网络拓扑图,网络中有n个节点,现欲求拓扑图中某节点v0到v的最短路径.原理:为拓扑图 定义节点集合S、T:S中的节点均[已]找到最短路径,T中的节点[仍未]找到最短路径。采用最短路径递增的方式来找到各个节点的最短路径。对T中的某节点N寻找最短路径时,有此判断:N的最短路径上的其他节点都位于S中。初始化时将本
2012-04-25 22:16:52 943 3
原创 GeekOS源代码学习(9)project1中Init_DMA与Init_Floppy
生成project1$ startProject project1 ./geekos-0.3.0/src/ project0在当前目录下生成了project1目录再来看一下main.c。/* * GeekOS C code entry point * Copyright (c) 2001,2003,2004 David H. Hovemeyer * Copyright
2012-04-22 20:00:58 2204
原创 GeekOS学习(8)链表操作宏
这种手法,第一次见到。一个宏里面定义了多个内联函数。。不知如何称呼。不过宏只不过是原样替代。其实就是定义了很多个内联函数,但是两函数之间没有打回车,所有函数都在一行上完成。把代码贴上,注释都在代码上了,看一下就懂了。位于./include/geekos/list.h/* * Generic list data type * Copyright (c) 2001,2004
2012-04-16 19:32:36 679 1
原创 GeekOS学习(7)Project0,创建键盘输入进程
终于看完系统的启动代码了!!哈,基本上结构我们也都已经了解了,接下来就开始做project!先来看第一个,project0,要求创建一个内核线程,打印一些信息,并且调用Wait_For_Key来供用户输入字符。先找到Wait_For_Key函数来看看位于./src/geekos/keyboard.c/* * Wait for a keycode to arrive. *
2012-04-13 22:41:01 2436
原创 GeekOS源代码学习(6)Main函数中Init_Traps 和 Init_Timer 和 Init_Keyboard
回到Main中,看下一个函数Init_Traps()位于./src/geekos/trap.c/* * Initialize handlers for processor traps. */void Init_Traps(void){ Install_Interrupt_Handler(12, &GPF_Handler); /* stack exception *
2012-04-12 20:00:28 1963 4
原创 GeekOS源代码学习(5)Main函数中Init_Scheduler
来看Main中的下一个函数Init_SchedulerInit_Scheduler函数开启了系统的多任务机制。位于./src/geekos/kthread.cvoid Init_Scheduler(void){ struct Kernel_Thread* mainThread = (struct Kernel_Thread *) KERN_THREAD_OBJ;
2012-04-12 19:47:30 1627
原创 GeekOS源代码学习(4)Main函数中Init_CRC和Init_TSS和Init_Interrupts
看Init_CRC32()函数位于./src/geekos/crc32.c/* * This routine writes each crc_table entry exactly once, * with the correct final value. Thus, it is safe to call * even on a table that someone els
2012-04-11 21:33:33 1649
原创 GeekOS源代码学习(3)Main函数中Init_Mem初始化内存
这此来分析Main中的第三个函数Init_Mem(bootInfo)。参数bootInfo是在主函数Main中传入的,为struct Boot_Info类型定义在./include/geekos/bootinfo.hstruct Boot_Info { int bootInfoSize; /* size of this struct; for versioning */
2012-04-11 19:31:20 1573
原创 GeekOS源代码学习(3)Main函数中Init_BSS() 与Init_Screen()
Main函数的第一个函数Init_BSS()位于./src/geekos/mem.c中/* * Initialize the .bss section of the kernel executable image. */void Init_BSS(void){ extern char BSS_START, BSS_END; /* Fill .bss with ze
2012-04-10 22:19:35 2300
i400x_analyzer20091114
2017-11-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人