Xiaofan's profileMorningCSPhotosBlogListsMore Tools Help

Xiaofan Wu

Occupation
Location
Interests

MorningCS

5/26/2009

传说中的博主飘过

扫扫土、擦擦桌子、拖拖地,打开窗户透透气


飘走
1/8/2008

给SDCC用的GNU Makefile

PRJ := #这里写上工程名,这个名字将成为.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学习笔记-1

SDCC是一个开源的为嵌入式系统设计的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文件的名字
10/29/2006

又是n久没来了

好像有很多话要说,但是又说不出来
 
sigh
 
可能得到明年上半年才有心情静下来写东西
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]
 
Photo 1 of 6