发新帖我要提问
12
返回列表
打印

keil中生成lib文件的问题 求助

[复制链接]
楼主: 幻阁
手机看帖
扫描二维码
随时随地手机跟帖
21
都看了,瞎猜一下,不知道所长和热肠所说的回调函数是不是应该这样理解?

库文件外
void clr_cs() { _cs=0;}
void set_cs() { _cs=1;}
void set_dat() { _dat=1;}

库文件改成
extern void clr_cs(void);
extern void set_cs(void);
extern void set_dat(void);

void lib(void)
{
//_cs=0;
clr_cs();
.....
//_dat=1;
set_dat();

//_cs=1;
set_cs();
}

使用特权

评论回复
22
李冬发| | 2009-12-28 01:21 | 只看该作者
我还以为KC具有滞后编联功能。

使用特权

评论回复
23
冷漠| | 2009-12-28 11:44 | 只看该作者
本帖最后由 冷漠 于 2009-12-28 13:57 编辑

挺简单的:把端口需要改变部分的语句说明为extern ,另写一个配置模块test_config.C就行了。
下面提供三个模块,把模块二、三、做成库testlib.LIB。需要改变的部分做在配置模块test_config.C里,并包含在主模块test_main.C 中。

改变时,只要改变PORT.H的内容就行了。

模块一、test_main.c
#include <reg51.h>
#include "PORT.h"
#include "main.h"
#include"test_config.c"
extern void lib(void);

main()
{
while(1)
{
lib( );
}
}

模块二、test_lib.C
// #include <reg51.h>
#include "main.h"
extern void port_out(uchar,bit);

void lib( )
{
port_out(id_cs,off);
//.....
port_out(id_dat,on);
port_out(id_cs,on);
port_out(id_dat,off);
}

模块三、test_config.C
#include <reg51.h>
#include "main.h"
#include "PORT.h"

void port_out( uchar port_id, bit val )
{
  switch(port_id)
  {
  case id_cs :  
        _cs = val;
         break;
  case id_dat:
        _dat= val;
         break;
  default:   
         break;
  }
}

使用特权

评论回复
24
冷漠| | 2009-12-28 11:50 | 只看该作者

这样标准化,函数库可以移植了。

本帖最后由 冷漠 于 2009-12-28 19:33 编辑

PORT.H
#ifndef __PORT_H__
#define __PORT_H__

sbit _cs = P0^4;
sbit _dat= P2^4;
#endif

MAIN.H
#ifndef __MAIN_H__
#define __MAIN_H__

#define uchar  unsigned char   
#define id_cs    1
#define id_dat   2

#define  on   1
#define  off   0
#endif

使用特权

评论回复
25
冷漠| | 2009-12-28 14:20 | 只看该作者
本帖最后由 冷漠 于 2009-12-28 14:23 编辑



使用特权

评论回复
26
MK60| | 2014-12-25 14:41 | 只看该作者
都没注意到吗?生成库文件的时候必须按“Build”按钮,而不是编译C文件的按钮——问题出在这!

使用特权

评论回复
27
MK60| | 2014-12-25 16:40 | 只看该作者
冷漠 发表于 2009-12-25 21:00
再谈端口文件的作用。其实6楼说的方法是C语言移植技术所采用的一般方法。——所有C模块都是为了做出来重复 ...

“咱们的惯性思维总以为库文件中的OBJ模块是已经编译好的,内容固定不变的,但是忽略了一点:OBJ文件没有经过连接,那么其中的地址内容就是不定的、浮动、可重定位的。而端口地址部分在连接 / 定位的时候,当然就是依据PORT.h 里的用户定义内容确定。”
——这里理解有误:浮动、可定位指的是模块程序的映像地址,跟软件中的硬件寄存器地址是两码事。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则