打印

自制的PIC18Fxxxx系列C编译,请提意见

[复制链接]
8874|52
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
su_mj000|  楼主 | 2008-4-14 02:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://bbs.21ic.com/upfiles/img/20084/200841415844641.rar
https://bbs.21ic.com/upfiles/img/20084/20084142054155.rar

因文件夹超过300KB只得分成两次上传。下载后须将后者放入前者的文件夹中。

本C编译一起的最大特点是:(1)简单易用,几分钟内便轻松上手。(2)能支
持扩展指令(使用 -X 选项);(3)即使在传统指令下,也能支持函数的递归
调用。(4)支持各类指针。(5)支持镕丝(fuse)和EEPROM;(6)优化较好,
不用调整BSR寄存器。

弱点:(1)暂不支持浮点运算;(2)预处理器功能较差;(3)不支持结构
中的位定义。(4)只在DOS下运行。

用户手册还未完成。下面仅给出一些必需的命令格式和语法要点:
[1] 下载和装配:解压即可,设置路径名。
[2] 编译命令:
    p18cc main.c timer.c      /// 对文件(main.c 及timer.c)进行编译 (传统指令)


    p18cc -X main.c timer.c   /// 对文件(main.c 及timer.c)进行编译 (扩展指令)

[3] 汇编命令:

    as18 main.asm timer.asm   /// 汇编命令,产生可浮动目标文件。

[4] 连接命令:

    lk18 main.obj timer.obj -o main /// 连接可浮动目标文件,产生main.hex和main.map文件。


[5] 中断服务子程序:

   interrupt () @ 0x08        /// 高优选级中断入口。
   {
     ........
   }

   interrupt () @ 0x18        /// 低优选级中断入口。
   {
     ........
   }


[6] flash中常量数据的存取

   int *p, n;
   ... 

   n = _rom_ (p);     /// _rom_ () 是编译保留函数,用以对flash ROM的读取。


   rom char a[] = "abcdefg";   /// rom 是关键字,比const更强制。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

   欢迎提出您的宝贵意见!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




    

相关链接:https://bbs.21ic.com/upfiles/img/20084/20084142054155.rar
沙发
su_mj000|  楼主 | 2008-4-14 02:27 | 只看该作者

谢10楼的好意

看了海尔芯片上海公司的招聘要求。对招聘要求中的有几条
觉得还马虎可以。但最后一条好像觉得无法达到。算了!

谢谢10楼的好意,心领了!

使用特权

评论回复
板凳
lanyong| | 2008-4-14 02:27 | 只看该作者

兄弟

可以去试下,最后一条应该也没什么啊.

有两条路.
如果你真想做这个而不是玩的话.

1:去家大公司.
2:找几个人做个小公司
www.ccsinfo.com
应该是家小公司,人家做编译器一样做得很好.

使用特权

评论回复
地板
xieyuanbin| | 2008-4-14 08:12 | 只看该作者

奖励楼主的精神

先穿裤子,再下载慢慢看

使用特权

评论回复
5
su_mj000|  楼主 | 2008-4-14 09:08 | 只看该作者

小例子

简单的例子:

///////////////////////////////////////////////////////////
#include <pic18f1220.h>        // 使用PIC18F1220定义库

#pragma void_return            // 此函数不需返回,节省ROM
void main ()
{
    bank0 char a;              // 只有bank0需定义,可节省ROM

    TRISB = 0x00;              // 设定PORTB为输出
    for(;;)
    {
        LATB++;                // 从PORTB口述出不同分频的方波
        for (a = 0; --a;);     // 延时
     }
}

使用特权

评论回复
6
lanyong| | 2008-4-14 11:40 | 只看该作者

厉害,搞C编译器

搞好了,前途无限,嘿嘿.

使用特权

评论回复
7
兰天白云| | 2008-4-14 18:33 | 只看该作者

头回听说,还以为看错了

支持

使用特权

评论回复
8
nilau| | 2008-4-15 08:19 | 只看该作者

强大

使用特权

评论回复
9
ocon| | 2008-4-16 03:13 | 只看该作者

哗~叹为观止,真的假的啊?

使用特权

评论回复
10
su_mj000|  楼主 | 2008-4-16 05:28 | 只看该作者

试一试便知真假,请提意见

不可否认的是,编译器的设计很难。P18CC的源代码全部是白手起家,
一个字符一个字符地输入,其中的数据结构很复杂,几句话是讲不明
白的。

已经使用该改编译器做了一个MP3,用pic18f2520控制,下面是main()
的代码:

#include <p18f2520.h>
#include <stdio.h>
#include "define.h"
#include "timer0.h"
#include "pwr.h"
#include "spi.h"
#include "key.h"
#include "vs1011.h"
#include "lcd3310.h"
#include "nokialcd.h"
#include "mmcfile.h"
#include "play.h"

#pragma CONFIG1H    0x88
#pragma CONFIG2L    0x1e
#pragma CONFIG2H    0x1e
#pragma CONFIG3H    0x81
#pragma CONFIG4L    0xc1

//#pragma short_branch
//#pragma short_call

enum {
    MP3_READY,
    MP3_PLAY,
    MP3_PAUSE,
    MP3_STOP,
    MP3_SKIP,
    MP3_DELAY
};

void turn_off (void);
char key_process (char mp3_status, unsigned int *music_cnt);
void VS1011_test (void);

//char *string3 = "MMC file ok!";

////////////////////////////////////////////////////////////////////
#pragma void_return
void main ()
{
    bank0 static unsigned char mp3_status = MP3_READY;

    ADCON1   = 0x07;      // set PORTA as digital port
    OSCCON   = 0x60;    // INCOSC block on: 4MHz, primary mode
    OSCTUNE |= 0x4f;    // PLLEN = 1: enable PLLx4
//    PLLEN   = 0;        // PLLEN = 0: disable PLLx4
    SWDTEN  = 0;

    LATC  |=  3;        // LED pin init
    TRISC &= ~3;

    CMCON  = 0x02;        // comparator mode
    CVRCON = 0xc0 + 10;    // reference valtage mode and voltage

    KEY_init ();
    TMR0_Init ();

    /*    devices initialization */
    SPI_init ();
    VS1011_init ();
    LCD_init ();

    // wait for power buttom really pressed
        while ( PWR_status == PWR_INIT );

    TRISA &= ~(1 << 3);
    LATA  |=  (1 << 3);

    for (;;)
    {
        LCD_clear();
        LCD_write_stringROM (0, 1, "Check MMC SPI ");

        if ( MMC_Init () != MMC_OK )
        {
            LCD_clear();
                           LCD_write_stringROM (0, 1, "MMC SPI not OK!");

                     if ( PWR_status == PWR_OFF )
                         turn_off ();

                        continue;
        }

                LCD_write_stringROM (0, 1, "MMC SPI OK!");

        if ( FILE_InitEntry () == FILE_OK )
        {
            LCD_write_stringROM (0, 1, "MMC file OK!");
            LCD_write_stringROM (0, 2, "search...");

            PLAY_ctrlBlk.totalMusic   = FILE_searchMP3Files ();
            PLAY_ctrlBlk.currentMusic = 1;

            mp3_status = MP3_READY;
            VS1011_setVol (30);

                        while ( PWR_status != PWR_OFF )
            {
                if ( PLAY_ctrlBlk.currentMusic > PLAY_ctrlBlk.totalMusic )
                    PLAY_ctrlBlk.currentMusic = 1;
                else if ( PLAY_ctrlBlk.currentMusic == 0 )
                    PLAY_ctrlBlk.currentMusic = PLAY_ctrlBlk.totalMusic;

                FileDesc_t *fp = FILE_FindFile (PLAY_ctrlBlk.currentMusic);

                if ( fp == NULL )
                    break;

                PLAY_init (fp);

                unsigned char play_status, delay_time;

                play_status = PLAY_OK;

                do
                {
                    mp3_status = key_process (mp3_status, &PLAY_ctrlBlk.currentMusic);

                    switch ( mp3_status )
                    {
                        case MP3_PLAY:
                            play_status = PLAY_music (0);
                            break;

                        case MP3_SKIP:
                            PLAY_music (100);        // skip 100 sectors of data
                            delay_time = TMR0_cnt;
                            mp3_status = MP3_DELAY;
                            break;

                        case MP3_DELAY:
                            if ( TMR0_Elapsed (delay_time) >= (750/5) )
                                mp3_status = MP3_PLAY;
                            break;

                        case MP3_STOP:
                            PLAY_fade_out ();
                            play_status = PLAY_DONE;
                            mp3_status  = MP3_READY;
                            break;
                    }

                } while ( play_status != PLAY_DONE && play_status != PLAY_ERR && PWR_status != PWR_OFF );


                if ( mp3_status == MP3_PLAY && play_status == PLAY_DONE )
                    PLAY_ctrlBlk.currentMusic++;
            }
        }

        if ( PWR_status == PWR_OFF )
            turn_off ();
    }
}

/////////////////////////////////////////////////////////////////////////
#pragma void_return
void turn_off (void)
{
    LCD_clear();

    for(;;)
        LATA &= ~(1 << 3);
}

/////////////////////////////////////////////////////////////////////////
char key_process (char mp3_status, unsigned int *music_cnt)
{
    switch ( KEY_get () )
    {
        case KEY_PLAY:
            switch ( mp3_status )
            {
                case MP3_READY:
                case MP3_PAUSE:
                    KEY_ctrl = MODE_KEY_DISABLED;
                    return MP3_PLAY;

                case MP3_PLAY:
                    KEY_ctrl = MODE_KEY_ENABLED;
                    return MP3_PAUSE;
            }
            break;

        case KEY_UP:
            switch ( mp3_status )
            {
                case MP3_PLAY:
                    WREG = VS1011_incVol ();
                    LCD_volStatus (WREG);
                    break;

                case MP3_READY:
                case MP3_PAUSE:
                    (*music_cnt)++;
                    return MP3_STOP;
            }
            break;

        case KEY_DOWN:
            switch ( mp3_status )
            {
                case MP3_PLAY:
                    WREG = VS1011_decVol ();
                    LCD_volStatus (WREG);
                    break;

                case MP3_READY:
                case MP3_PAUSE:
                    (*music_cnt)--;
                    return MP3_STOP;
            }
            break;

        case KEY_UP | KEY_MODE:
            if ( mp3_status == MP3_PLAY || mp3_status == MP3_DELAY )
            {
                if ( mp3_status == MP3_PLAY )    // fade out the sound
                    PLAY_fade_out ();            // when in PLAY status,
                                                // to reduce jitter
                return MP3_SKIP;
            }
            break;

        case KEY_MODE:
            KEY_ctrl = MODE_KEY_DISABLED;
            return MP3_STOP;
    }

    return mp3_status;
}

使用特权

评论回复
11
lanyong| | 2008-4-16 10:23 | 只看该作者

妈哟,国家应该要支持你这样的人才才是啊!

都不知道哪些税收跑哪里去了哦.

兄弟,加油搞,赚点欧元回来.

使用特权

评论回复
12
lanyong| | 2008-4-16 10:28 | 只看该作者

su_mj000,

海尔芯片上海公司在找象你这样的人才,你要不去试下?

使用特权

评论回复
13
chunk| | 2008-4-16 10:30 | 只看该作者

总算有人研究这个方面了。

大家都爱喊“我们用自主研发的核”,然后您再看那编译器,那开发工具,唉。。。。。

使用特权

评论回复
14
lanyong| | 2008-4-16 10:30 | 只看该作者

地址:

http://www.ichaier.com/hr/hrdetail.php?hr_id=16

使用特权

评论回复
15
lanyong| | 2008-4-16 10:33 | 只看该作者

?21ic中毒了

怎么发表日期:
lanyong 发表于 2007-6-1 10:30 PIC 单片机

去年儿童节?

使用特权

评论回复
16
xwj| | 2008-4-16 10:51 | 只看该作者

呵呵,别着急,明天就改成愚人节了

本来流星JJ想先回顾下愚人节的,
但是二姨说她想过儿童节
匠人JJ又说她想过三八节
...


最后还是二姨最大,二姨说了算...

使用特权

评论回复
17
ocon| | 2008-4-16 16:34 | 只看该作者

www.ccsinfo.com的编译器确实做得不错,特别是帮助做得很棒。

02年做网络监测设备的时候买过他们的编译器,通过一个老外买的,加上手册不到四千*币。

使用特权

评论回复
18
and| | 2008-4-16 21:19 | 只看该作者

原来是真家伙

一个字符一个字符地输入,其中的数据结构很复杂,几句话是讲不明白的。
-----
来道个喜,^_^

使用特权

评论回复
19
lifengtao| | 2008-4-16 21:53 | 只看该作者

对楼主 五体投地 般的佩服

国家幸甚啊~~~~
觉得楼主的十分之一 也比那些所谓的超男超女强一百倍,让那些垃圾在时间中消亡吧~~
楼主一定要**住啊,“天将降大任于……” 希望楼主像周立功那样有一番自己的事业啊,到时候我们能真正用上自己的单片机,在安上地道的国产编译器,那做出来的产品再卖给外国人,那是什么感觉~~ 希望大家努力!

使用特权

评论回复
20
lanyong| | 2008-4-17 09:37 | 只看该作者

su_mj000兄弟

如果你愿意我帮你去联系海尔上海,你看怎么样?

使用特权

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

本版积分规则

39

主题

286

帖子

1

粉丝