自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

talent_CYJ

When the going gets tough, the tough get going

  • 博客(43)
  • 收藏
  • 关注

原创 UC/OS-II 任务的状态

uc/os是一个抢占式多任务的实时操作系统,每个任务都有各自的状态,并且状态之间都有一定的转换关系。写下此文以作记录及帮助自己理清关系。在uc/os-ii中,任务的状态有5种:睡眠态、就绪态、运行态、等待态及中断服务态。通过下图可以有一个大致的认知:最左边的是睡眠态,该状态下的任务指的是还没交给uc/os-ii来管理,且驻留在程序空间(ROM或RAM)。把任务交给uc/os-ii管理的话需要调用创建

2016-12-06 15:21:18 6179

原创 uC/OS-II任务就绪表及任务调度

最近开始花时间去学习uc/OS-II,一方面是工作上用的是这个系统,另一方面就是想去了解实时操作系统与普通操作系统的区别,学到任务就绪表及任务调度这里,对实时的概念有所了解,所以写此文帮助自己梳理,也希望与读者交流。实时含有立即、及时之意。如果操作系统能使计算机系统及时响应外部事件的请求,并能及时控制所有实时设备与实时任务协调运行,且能在一个规定的事件内完成对事件的处理,那么这种操作系统就是一个实时

2016-10-11 10:18:26 2829 1

原创 <30天自制操作系统>第八天

花了将近1周时间来理清之前模糊的概念,感觉思路清晰了很多,今天是八天内容中的最后一天。以后的内容就不会每天都写文章了。今天的内容还是关于鼠标的控制,但是是让它真正的动起来。在主函数中,我们取得了鼠标的数据。for (;;) { io_cli(); if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) {

2016-07-26 14:15:08 782

原创 <30天自制操作系统>第六天

为了让鼠标能移动起来,必须使用中断,而要使用中断则必须将GDT和IDT初始化。在此之前,首先要初始化PIC,它的意思是可编程中断控制器。它是将多个中断信号集合成一个中断信号的装置,PIC检测着输入管脚的多个中断信号,只要有一个中断信号过来,就将唯一的输出管脚信号变成ON,并通知给CPU。 其中与CPU直接相连的PIC为主PIC,与主PIC相连的PIC称为从PIC。其中从PIC通过第2号IRQ与主P

2016-07-25 11:20:38 1138

原创 <30天自制操作系统>第五天

这章节内容比上一章节的更进了一步,不只是显示图像,而是显示文字。一个字符可以用8x16的长方形像素点阵来表示。例如: 将这些数据整理成一组数组,即static char font_A[16] = {0x00, 0x18, 0x18, 0x18, 0x18…} 有了这些数据之后只需将其写到VRAM中即可,下列函数实现该功能:void putfont8(char *vram, int xsize

2016-07-23 10:11:28 771

原创 <30天自制操作系统>第四天

第四天内容主要是基于第三天的图形界面显示更进了一步。主要是更复杂的显示,而不是单纯的切换到显示模式。对显卡内存进行数据写入,从而显示出我们想要的画面。想要画东西,只要往VRAM里写数据即可,先看以下程序:_write_mem8: ; void write_mem8(int addr, int data); MOV ECX,[ESP+4] ; [ESP+4]中存放

2016-07-22 14:03:10 1209

原创 <30天自制操作系统>第三天

在第三天中,在原来的基础上添加了部分功能。; haribote-ipl; TAB=4 ORG 0x7c00 ; 指明程序的装载地址; 以下这段是标准FAT12格式软盘专用的代码 JMP entry DB 0x90--略--; 程序核心entry: MOV AX,0

2016-07-21 18:22:09 1340

原创 <30天自制操作系统>第二天

第二天内容主要是关于一些寄存器的介绍以及使用。以下程序是对第一天程序的完善:; hello-os; TAB=4 ORG 0x7c00 ; 指明程序的装载地址; 以下这段是标准FAT12格式软盘专用的代码 JMP entry DB 0x90--略--; 程序核心entry: MOV AX,

2016-07-21 14:25:59 454

原创 <30天自制操作系统>第一天

买了这本书将近一年才开始看- =,最近看完第八天的内容,也就是实现了鼠标的移动。总的来说这本书感觉还是可以,大致上可以了解到一个操作系统是如何搭建。语言幽默风趣,每天的任务量不是特别多并且每天的章节内容明确,由于每个程序我都只是编译现成的代码来看实现效果,所以学完了8天的内容之后,许多概念还是迷迷糊糊,所以今天开始为每一天的内容写文章,总结这本书自己比较模糊的内容,同时也帮助自己梳理一下知识点,也为

2016-07-21 10:26:01 830

原创 编写程序tail,将其输入中的最后n行打印出来。

默认情况下,n的值为10,可通过可选参数改变n的值,命令tail -n将打印其输入的最后n行。#include <stdio.h>#include <stdlib.h>#include <string.h>#define DEFLINS 10#define LINES 100 #define MAXLEN 100 //每一行最大字符数量void error(char *);

2016-07-04 14:38:27 1375

原创 C语言编写的简单计算器程序

这两天在看一个C语言写的计算器程序,做了不少的功夫,跟着作者一步步的进行完善,了解了许多细节性的东西,在此自己做个总结,加深自己对程序的印象,也算是梳理。在该计算器程序,能进行加减乘除、sin、cos、exp等操作,同时能进行数值保存功能。而该计算器使用逆波兰表示法。即所有运算符都跟在操作数的后面,比如下列表达式: (1 - 2) * (4 + 5)采用逆波兰表示法表示为:1 2 - 4 5

2016-07-01 10:03:13 25095

原创 关于C语言的按位运算符

简单的不多说了,写此文章记录为了加深自己对按位运算符的运用。按位运算符有六个,分别是&按位与、|按位或、^按位异或、<<左移、>>右移、~按位求反&经常用于屏蔽某些二进制位|则用于将某些二进制位置置为1.^则是当六个操作数对应位不同时,将该位设为1,否则设为0.移位运算符<<和>>分别用于将运算的左操作数左移与右移,移动的位数由右操作数指定(右操作数必须是非负值,否则结果未定义)。对unsigned

2016-06-28 15:23:40 981

原创 将16进制数组成的字符串转换为相对应的整型值

int htoi(char hexstr[]){ int hexdigit, i, inhex, n; i = 0; if (s[i] == '0') { ++i; if (s[i] == 'x' || s[i] == 'X') ++i; else //这里做相应处理,可以

2016-06-28 10:27:09 1042

原创 编写一个删除C语言程序中所有注释语句的程序

#include <stdio.h>void rcomment (int c);void in_comment_one (void); //该函数用于处理/*及*/的注释符void in_comment_two (void); //该函数用于处理//的单行注释符void echo_quote (int c);int main(void){ int c; while (

2016-06-27 17:48:43 10105

原创 编写一个程序,把较长的输入行“折”成短一些的多行,折行的位置在输入行的第N列之前的最后一个非空格之后

#include #define TABINC 4#define MAXCOL 10 //指定输入行的折行位置char line[MAXCOL]; /* 全局数组,在以下函数中都能共同访问 */int exptab(int pos);int findblnk(int pos);int newpos (int pos);void printl(int pos); i

2016-06-25 10:25:26 1757

原创 编写一个程序,打印输入中单词长度的直方图

#include <stdio.h>#define MAXHIST 15#define MAXWORD 11#define IN 1#define OUT 0int main(){ int c, i, j, nc, state; //其中nc用于计算一个单词长度,state用于判断是否在计算一个单词 int len; //用于保存根据比例计算出来需要打印的

2016-06-24 11:45:27 3501 1

原创 读入一组文本行,并把最长的文本行打印出来

/*如题,该算法的框架如下:while(还有未处理的行)if(该行比已处理的最长行还要长) 保存该行 保存该行的长度打印最长的行*/#include <stdio.h>#define MAXLINE 1000int getline(char line[], int maxline);void copy(char to[], char from[]);int main(voi

2016-06-24 11:32:23 1005

原创 将一个整数转换为单个字符输出函数实现的细节性问题

首先看一下以下这个程序:void printnum (long n){ if (n < 0) { putchar('-'); n = -n; } if (n >= 10) printnum(n / 10); putchar ((int)(n % 10) + '0');}该程序的流程: 首先检查n是否为负,如果

2016-05-19 16:34:43 820

原创 C语言二分查找法实现与细节

刚学C的时候没过多久就接触到这种算法,总的来说这个算法并不难。时隔好久,今天看了下书,加深了一些理解,谨记此文,用于回顾及梳理知识。如要求: 编写一个函数,对一个已排序的整数表执行二分查找。函数的输入包括一个指向表头的指针,表中的元素个数,以及待查找的数值。函数的输出是一个指向满足查找要求的元素的指针,当未查找到要求的数值时,输出一个NULL指针。下图显示大致搜索过程: 假定x是要搜索的元素

2016-05-16 17:42:32 2587

原创 LINUX/UNIX的文件操作函数

本文用于记录在LINUX编程中,常用的文件操作函数,包括系统调用和库函数。针对输入输出操作,直接使用底层系统调用的一个问题是它们的效率十分低,原因在于:1.使用系统调用会影响系统的性能,与函数调用相比,系统调用的开销要大些,因为在执行系统调用时,Linux必须从运行用户代码切换到执行内核代码,然后再返回用户代码。 2.硬件会限制对底层系统调用一次所能读写的数据块大小。比如,磁带

2016-05-04 16:00:25 1844

原创 C旧式与新式函数的声明与定义

关于C语言函数的原型声明与函数定义,这里涉及了许多的内容,以此文章,记录自己所了解的知识,以备日后查阅,同时也帮助自己和大家了解这当中暗含的“陷阱”。由于历史的原因,C语言的函数声明有旧式和新式之分,旧式就是K&R,而新式则是ANSI,如下图: 现在倡导的是使用后者,而不要使用前者,对于K&R,由于存在大量旧式代码,为了保持兼容,所以没有被正式废弃。 这两者在参数传递的时会有所区别,在K&R中,

2016-05-03 12:02:04 5146

原创 关于程序运行时的数据结构

对于可执行文件,它包含了许多的段,例如(数据段,文本段,BSS段等),它们是二进制文件中简单的区域,里面保存了和某种特定类型(如符号表条目)相关的所有信息。对于一个源文件,哪些地方会放到哪个段,如下图: 可得知,程序代码是存放在文本段,初始化的全局变量和静态变量是存放到数据段中的,而没有初始化的全局变量和静态变量则是存放到BBS,运行时所需要的BSS段的大小记录在目标文件中,但BSS段并

2016-04-29 10:54:35 2284

原创 关于链接的一些理解

对于链接,它是程序编译的一个环节。 绝大多数编译器都不是一个单一的庞大程序,而是由许多稍小的程序组成。这些单独程序通常包括:C预处理器、语法和语义检查器、代码生成器、汇编程序、优化器、链接器、还包括一个调用所有这些程序并向各个程序传递正确选项的编译器驱动器程序。链接一般分为两种:静态链接和动态链接。如果函数库的一份拷贝是可执行文件的物理组成部分,则称为静态链接。如果可执行文件只是包含了文件名,让载

2016-04-28 14:14:41 720

原创 将C语言的声明翻译成通俗的语言

#include #include #include #include #define MAXTOKENS 100#define MAXTOKENLEN 64enum type_tag { IDENTIFIER, QUALIFIER, TYPE }; /* 标识符,限定符,类型 */ struct token { char type; char string[

2016-04-22 16:55:54 945

原创 关于C语言中无符号与有符号数之间运算问题

int array[] = {23, 34, 12, 17, 204, 99, 16};#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))int main(void){ int d = -1, x; /* ... */ if (d <= TOTAL_ELEMENTS - 2) x = array[d

2016-04-20 10:45:17 1434

原创 关于C语言时间获取函数调用的概念

在C语言的程序开发过程中,经常会用到获取时间的函数。而获取到的时间又分为本地时间还有世界统一时间UTC。对于这两个概念,世界的每个地区都有自己的本地时间,在Internet及无线电通信时,时间的统一非常重要! 整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信中,为统一而普遍使用一个标准时间,称为通用协调时。UTC与格林尼治平均时一样,都与英国伦敦的本地时相同。 在C程序开发中,

2016-04-19 09:51:22 1254

转载 SVN初学者使用说明

工作过程中要学习SVN,所以今天专门的搜了资料,写在这里也是让自己以后回过头可以看看。SVN简介: 为什么要使用SVN?      程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本。Subversion是什么?   它是一个自由/开源的版本控制系统,一组文件存放在中心版本库,记录每一次文件和目录的

2016-04-12 14:28:34 9489

原创 初步了解Linux内核 (3)

整个内核的启动流程大致上为:arch/arm/kernel/head.S__switch_data start_kernel setup_arch(&command_line) //获取及解析u-boot传入的启动参数 parse_early_param //从__setup_start到__setup_

2016-01-20 16:15:02 454

原创 初步了解Linux内核 (2)

根据执行make uImage指令,去顶层目录中的Makefile去寻找对应项当在顶层目录的Makefile中查找uImage关键字,会出现查无此字,但是在arch/arm/Makefile中可以找到uImage,但是在顶层目录中却能执行make uImage这条指令,所以可以推测出顶层目录的Makefile一定包含了arch/arm目录下的Makefile,打开顶层目录的Makefile可以发现以

2016-01-20 14:22:15 528

原创 初步了解Linux内核 (1)

今天在学习JZ2440中,需要将Linux内核烧写进板子中。 今天谈一下整个烧写内核过程以及对Linux进行分析,当然,只是粗略的去分析,本人还是一枚新手,初步学习希望能记录下整个Linux内核是如何一步步烧写进板子以及Linux内核的启动过程是怎么样。也希望有误的地方各位能指点我一下,还有能一块交流。当我拿到JZ2440时,如何将内核烧写进板子中呢? 首先使用厂家提供的补丁文件对内核进行打补丁

2016-01-20 11:16:25 1113

原创 初步了解UBOOT (4)

对于do_bootm函数,它的内容如下:int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ ... image_header_t *hdr = &header; ... if (argc < 2) { addr = load_addr; } else {

2016-01-19 23:25:14 570

原创 初步了解UBOOT (3)

进入到main_loop函数中,大致内容如下:void main_loop (void){...#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0) s = getenv ("bootdelay"); bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOT

2016-01-19 21:49:44 398

原创 初步了解UBOOT (2)

打开uboot的链接脚本 u-boot.lds , 内容如下:SECTIONS{ . = 0x00000000; . = ALIGN(4); .text : { cpu/arm920t/start.o (.text) *(.text) } . = ALIGN(4); .rodata : { *(.rodata

2016-01-19 20:26:39 517

原创 初步了解UBOOT (1)

这两天在学习UBoot,简单说说自己的认识。 当然自己还是个新手,关于Uboot的更深入了解还有待提升自己,希望以后工作了能够对它越来越了解。首先Uboot是Universal boot loader,就是通用的bootloader,也即引导加载程序,用来加载和启动操作系统的。在我所学的嵌入式开发板JZ2440中,它是用来启动LINUX操作系统,当然启动LINUX操作系统是它的最终目的,这其中Ub

2016-01-19 19:16:41 677

原创 关于ARM指令中位置无关和位置相关代码的认识

今天在一个问题上折腾了又是半天。就是在学JZ2440串口通信的时候,在sdram初始化函数中有这么一句话/* * 设置存储控制器以使用SDRAM */void memsetup(void){ volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE; /* 这个函数之所以这样赋值,而不是像前面的实验那样

2016-01-17 20:14:05 1180

原创 开发板 nfs : server xxx.xxx.xxx.xxx not responding,still trying问题解决方法

今天在学JZ2440过程中,使用NFS作为根文件系统来启动板子,遇到了一个失败问题,提示说是 nfs: server 192.168.3.16 not responding. still trying. 首先说说我的开发环境,板子的IP地址是192.168.3.123,PC机WINDOSW的IP地址是192.168.3.196,而虚拟机LINUX的IP地址是192.168.3.16.在uboot

2016-01-07 20:11:59 1839

原创 题目如下:编写函数 void written_amount(unsigned int amount,char *buffer); 它把amount表示的值转换为单词形式,并

题目如下:编写函数 void written_amount(unsigned int amount,char *buffer); 它把amount表示的值转换为单词形式,并储存于buffer中。这个函数可以在一个打印支票的程序中使用。例如,如果amount的值是16312,那么buffer中存储的字符串应该是 SIXTEEN THOUSA

2015-10-16 15:03:30 1343

原创 求两个数的最大公约数和最小公倍数

求一个数的最大公约数有很多种方法,最常用也是最简单的是辗转相除法和更相减损法。这是辗转相除法的原理。 辗转相除法的格式 例如,求(319,377): ∵ 319÷377=0(余319) ∴(319,377)=(377,319); ∵ 377÷319=1(余58) ∴(377,319)=(319,58); ∵ 319÷58=5(余29), ∴ (319,58)=(58,29);

2015-10-14 19:58:23 751

原创 C语言求质数的方法

质数就是只能被1和本身整除的数。Eratosthenes筛选法是一种计算质数的有效方法。这个算法的第一步就是写下所有从2至某个上限之间的所有整数。在算法的剩余部分,遍历整个列表并剔除所有不是质数的整数。后面的步骤是这样的。找到列表中的第1个不被剔除的数(也就是2),然后将列表后面所有逢双的数都剔除,因为它们都可以被2整除,因此不是质数。接着,再回到列表的头部重新开始,此时列表中第一个尚未被剔除的第1

2015-10-13 20:53:51 3353

原创 编写一个函数,从一个字符串中去除多余的空格。当函数发现字符串中有一个地方由一个或多个连续的空格组成,就把它们改成单个空格字符。

编写一个函数,从一个字符串中去除多余的空格。当函数发现字符串中有一个地方由一个或多个连续的空格组成,就把它们改成单个空格字符。#include <stdio.h>#include <stdbool.h>#include <string.h>#define MAX_NUM 128void deblank(char str[]);int main (void){ char str[MA

2015-10-08 17:52:10 1953

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除