Xiaofan's profileMorningCSPhotosBlogListsMore ![]() | Help |
|
MorningCS1/8/2008 给SDCC用的GNU MakefilePRJ := #这里写上工程名,这个名字将成为.hex文件的主文件名
MAINC := #这里写上一个.c文件的名字,写在这里的文件要包括main()函数,比如main.c
CC := sdcc #用来调用sdcc的命令行,如果在path环境变量里找不到sdcc.exe,这里写成c:\sdcc\bin\sdcc.exe之类的样子
CPPFLAGS := #预处理器参数 CFLAGS := -mmcs51 #编译器参数 LDFLAGS := --iram-size 256 --xram-size 0 --code-size 8192 --stack-size 32 #链接器参数 SRCS := $(MAINC) #这一行及下一行得到当前目录下的.c文件的列表,并且确保包括main()函数的文件是第一个(sdcc的bt要求)
SRCS += $(filter-out $(MAINC), $(wildcard *.c)) DEPS := $(patsubst %.c, %.d, $(SRCS)) OBJS := $(patsubst %.c, %.rel, $(SRCS)) IHEX := $(addsuffix .ihx, $(PRJ)) HEX := $(addsuffix .hex, $(PRJ)) .PHONY:all clean rebuild
all:$(HEX)
$(HEX):$(IHEX)
packihx $(IHEX) > $(HEX) $(IHEX):$(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $(IHEX) %.rel:%.c $(CC) -MM $(CPPFLAGS) $< > $(patsubst %.rel, %.d, $@) #为.c文件生成.d文件 $(CC) $(CFLAGS) -o $@ -c $< ifneq "$(MAKECMDGOALS)" "clean" -include $(DEPS) endif rebuild:clean all
clean: rm -f *.bak rm -f *.rel rm -f *.asm rm -f *.lst rm -f *.sym rm -f *.map rm -f *.lnk rm -f *.mem rm -f *.i rm -f *.d rm -f *.rst 2/15/2007 SDCC学习笔记-2二、存储类型
sdcc用在mcs51上时,共有七种存储类型 keyword comment
data/near 存放在ram中,small模型的默认存储类型。 xdata/far 存放在外部ram中,large模型的默认存储类型 idata 存放在ram的间接寻址部份 pdata paged xdata,一般是xdata的前256字节 code 存放在flash中 bit 存放在可以按位寻址的内存中(0x20-0x2f) sfr/sfr16/sfr32/sbit sfr和sfr中的位 需要注意的是: 1、最后两种存储类型bit和sft/sbit既是存储类型,又是数据类型 2、sdcc的sfr定义域法语可能与其它编译器不兼容,比如定义0x80的sfr为P0,其它编译器可能要写成: sfr P0=0x80; 但是sdcc要写成: sfr at (0x80) P0; 并且sdcc会把第一种写法解释为将0x80赋值给一个叫做P0的变量,而不会产生任何警告 三、MCS51的指针的存储类型 sdcc允许显示的指明指针的存储类型和指针指向的数据的存储类型。 比如指针指向外部ram的数据,但是指针本身在ram中,可以写成 xdata unsigned char * data p; 如果没有指明指针和它指向的数据的存储类型,sdcc会使用3字节的通用指针。这种指针可以指向任何地方 通用指针的最高字节中保存了指针指向的数据的位置信息。通用指针也可以用于函数参数的传递。 四、绝对寻址 定义变量时在存储类型后面加at关键字可以指定变量的地址,比如: idata at (0x0e) unsigned int ch; 这样ch这个变量代表了内部ram中的0x0e和0x0f。 对于使用绝对寻址的变量,sdcc不会为其保留空间,程序员要自己确保不会有其他的数据覆盖这个变量。 sdcc也有volatile关键字,防止进行错误的访问优化 五、参数和局部变量 默认情况下,参数和局部变量被放置在全局数据区,就像static的变量一样。这时函数是不可重入的。有三种方法可以使函数和局部变量放在栈上: 1、使用--stack-auto命令行选项 2、使用#pragma stackauto编译指示 3、使用reentrant关键字,比如; void foo(char i) reentrant { //blablabla... } 需要注意的是,reentrant关键字只是把参数和局部变量放到栈上,而不保证寄存器的独立性(it does not mean that the function is register bank independent) 当局部变量不在栈上时,可以指定存储类型,否则只有static的变量才能指定。参数不能指定存储类型,只能使用当前内存模型默认的存储类型或者放在栈上。 如果可重入函数有非static的bit型变量,将会凑成byte压栈。 SDCC学习笔记-1SDCC是一个开源的为嵌入式系统设计的C编译器。我将在毕业设计中使用SDCC作为LPC900的编译器。
一、使用SDCC
1.1单文件工程
如果工程只有一个源代码文件,只要用类似于
sdcc foo.c
的命令行就可以将源代码编译成intel hex格式的代码。
这中间sdcc会产生下列的输出文件:
foo.asm-汇编代码,由编译器创建
foo.lst-汇编列表文件,由汇编器创建
foo.rst-更新过的列表文件,由链接器创建
foo.sym-符号列表文件,由汇编器创建
foo.rel/foo.o-就是obj文件
foo.map-内存映射文件
foo.mem-内存使用统计文件
foo.ihx-intel hex格式的代码
如果使用了调试模式,还会有:
foo.adb-用于创建.cdb文件的含有调试信息的中间文件
foo.cdb-用于调试的文件,有一个专门的文档讲这种文件的格式
foo.-Absolute Object Module Format(AOMF)文件
foo.dump-用于调试编译器本身的dump文件
1.2多文件工程
假设main函数在foomain.c中,另外还有foo1.c和foo2.c,那么可以这样编译:
sdcc -c foo1.c
sdcc -c foo2.c
sdcc foomain.c foo1.rel foo2.rel
第三条命令也可以换成下面的两条命令:
sdcc -c foomain.c
sdcc foomain.rel foo1.rel foo2.rel
如果是写成后面这种形式,最后一条命令中的第一个rel文件必须包含main函数
1.3ihx文件的后处理
.ihx文件不能直接用于miniICP的输入往LPC900里面烧,要经过一步处理:
pachihx foo.ihx > foo.hex
这样foo.hex就可以拿去烧了
1.4使用lib库
如果要用到标准库之外的lib库,可以写这样的命令:
sdcc foomain.c foolib.lib -L mylib
-L选项指定库的搜索路径,可以是相对路径,也可以是绝对路径
sdcc的lib文件都是纯文本,自带的标准库的内容是相关rel文件的列表
用sdcclib做出来的lib是一种带标签的纯文本
1.5用sdcclib制作库
假设一个库libfoo.lib包括libfoo1.c和libfoo2.c两个源代码文件,可以这样来生成libfoo.lib:
sdcc -c libfoo1.c
sdcc -c libfoo2.c
sdcclib libfoo.lib libfoo1.rel
sdcclib libfoo.lib libfoo2.rel
这样得到libfoo.lib以后,还可以用
sdcclib -s libfoo.lib
查看库中包含的符号,或者用
sdcclib -m libfoo.lib
查看库中包含的rel文件的名字 4/30/2006 2米moxon的一些理论值最大增益出现在仰角2度,方位角0度的位置,最大增益为10.81dBi,
前后比39.89dB,主瓣宽度(-3dB)142.2度 在145MHz这个频点上理论驻波比1.074,阻抗(51.77-3.197j)欧姆 计算软件为EZNEC3.0,垂直极化,高度16米,采用铜的线损 这两天做了个moxon天线发信人: morningzjg (莫日), 板面: HAM
标 题: 制作moxon天线的总结 发信站: 飘渺水云间 (Sun Apr 30 10:15:35 2006), 转信 先简单介绍一下moxon天线。moxon天线是两单元yagi的一种变形,
是一种矩形线框天线。它的大体结构如下图 馈电点
┌────── ──────┐ │ 振子 振子 │B C │ │ │ 反射器 │D └──────────────┘ A 大体日程:
27日去建材市场买了一根16mm直径的pvc管,和截面积2.5mm^2的硬 导线; 28日去EM买了馈线和接头;晚上去BD5HBO家里开始制作,做好了振 子和主梁,焊好了接头的地; 29日在寝室完成了剩余的工作,下午5点多完工,接在318上发射了 一下,没人应。晚上又跑出来呼,叫到了BG5HLA,遂烦劳他接我去HBO 那里。其间与玉泉的HLY做了通联。在HBO家里测试发现驻波比较大,他 建议我加一个巴伦,并帮我绕好了相应的线圈。弄好之后驻波比有明显 的下降,可以正常使用了。回到寝室后又与HLY、HLN、lungfish做了通 连,效果不错。 相关的数据:
设计频率145MHz,整个线框长A=746.7mm,宽(B+C+D)=275.7mm,振 子向后弯折B=104.5mm,反射器向前弯折D=142.1mm,两者的空隙C=29.1mm. 用50-3馈线以大约5cm的直径绕3-4圈作为平衡-不平衡转换。 未加巴伦时谐振在140MHz附近,2米业余段的驻波比大于5。 加上巴伦以后,在2米业余段的驻波比下降到小于2。 测试的情况:
未加巴伦时,我在zjg-bf朝南用318v,BG5HLA在古墩路文三路口附 近,用FT-7800,50W,sg7500。我用拉杆天线时HLA那里S表不打表,换 为moxon时有S3-S4。在yq-31舍朝北的BG5HLY报告可以抄收 27日去建材市场买了一根16mm直径的pvc管,和截面积2.5mm^2的硬 导线; 28日去EM买了馈线和接头;晚上去BD5HBO家里开始制作,做好了振 子和主梁,焊好了接头的地; 29日在寝室完成了剩余的工作,下午5点多完工,接在318上发射了 几点总结: 1、 pvc管做主梁不是很合适,特别是2米波段天线尺寸比较大的情 况下。主要原因是强度不够,太软,举高了会来回晃 2、 V段天线振子最好不要用单股粗线,而要用多股线。因为高频 电流有趋肤效应,所以要增加振子的表面积,以提高辐射效率。 3、 有合手的工具很重要,从身边寻找可以利用的东西也很重要 感谢HBO在制作过程中提供的场地、设备和技术支持,
感谢HLA与我进行的通连,他是我用未经测试的天线通连的第一位友台 感谢HLY与我做的测试,他是天线成型后我通连的第一位玉泉的友台 感谢5AG对我的帮助,我从他那里学到了基本的焊接技术,以及很多其他的有用的知识 感谢88,感谢HAM版,使我进入这个圈子,认识了这么多好朋友,好老师 -- ※ 来源:·飘渺水云间 freecity.cn·[FROM: morningzjg] |
||||
|
|