amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 8

突然要用 STC 写个东西,但是发现没有SDCC头文件,写个工具转...

[复制链接]
(160090315)

打赏出0元收入0元

发表于 2015-6-13 00:30:16 | 显示全部楼层 |阅读模式
突然要用 STC 写个东西,但是发现没有SDCC头文件,写个工具将 keil 的头文件转成 sdcc 的.
闲话不说,上代码. 写的比较脏,别介意.

<code>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char* args[])
{
    string filename = "stc15.h";
    ifstream file_in(filename.c_str());

    string s;
    string previous_addr;
    while( getline(file_in,s) )
    {
        if(s[0] == '/' || s[0] == '#')
            cout << s << endl;
        else if(s.length() > 4)
        {
            string::size_type type_end = s.find_first_of(' ');
            string type = s.substr(0, type_end);

            string::size_type name_begin = s.find_first_not_of(' ', type_end);
            string::size_type name_end = s.find_first_of(' ', name_begin);
            string name = s.substr(name_begin, name_end - name_begin);

            string::size_type addr_begin = s.find_first_not_of(" =", name_end);
            string::size_type addr_end = s.find_first_of(" ;", addr_begin);
            string addr = s.substr(addr_begin, addr_end - addr_begin);

            string comment;
            bool haveComment = true;
            if(addr_end == s.length() - 1)
            {
                haveComment = false;
            }

            if(haveComment)
            {
                string::size_type comment_begin = s.find_first_not_of("; ", addr_end);
                comment = s.substr(comment_begin);
            }

            if(type == "sfr")
            {
                cout << "SFR(" << name << ", "  << addr << ");";
                if(haveComment) cout << comment;
                cout << endl;
                previous_addr = addr;
            }
            else if(type == "sbit")
            {
                string bit_offset = addr.substr(addr.length()-1);

                cout << "SBIT(" << name << ", "  << previous_addr << ", " << bit_offset << ");";
                if(haveComment) cout << comment;
                cout << endl;
            }

        }
    }
    return 0;
}
</code>
(160090050)

打赏出0元收入0元

发表于 2015-6-13 00:34:41 | 显示全部楼层
<code>...</code>用方括号
(160056042)

打赏出0元收入0元

发表于 2015-6-13 10:01:29 | 显示全部楼层
什么玩意
(160032488)

打赏出0元收入0元

发表于 2015-6-13 16:34:03 | 显示全部楼层
虽然用不上,支持一下, 顺便测试一下2楼的。。。

  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>

  4. using namespace std;

  5. int main(int argc, char* args[])
  6. {
  7.     string filename = "stc15.h";
  8.     ifstream file_in(filename.c_str());

  9.     string s;
  10.     string previous_addr;
  11.     while( getline(file_in,s) )
  12.     {
  13.         if(s[0] == '/' || s[0] == '#')
  14.             cout << s << endl;
  15.         else if(s.length() > 4)
  16.         {
  17.             string::size_type type_end = s.find_first_of(' ');
  18.             string type = s.substr(0, type_end);

  19.             string::size_type name_begin = s.find_first_not_of(' ', type_end);
  20.             string::size_type name_end = s.find_first_of(' ', name_begin);
  21.             string name = s.substr(name_begin, name_end - name_begin);

  22.             string::size_type addr_begin = s.find_first_not_of(" =", name_end);
  23.             string::size_type addr_end = s.find_first_of(" ;", addr_begin);
  24.             string addr = s.substr(addr_begin, addr_end - addr_begin);

  25.             string comment;
  26.             bool haveComment = true;
  27.             if(addr_end == s.length() - 1)
  28.             {
  29.                 haveComment = false;
  30.             }

  31.             if(haveComment)
  32.             {
  33.                 string::size_type comment_begin = s.find_first_not_of("; ", addr_end);
  34.                 comment = s.substr(comment_begin);
  35.             }

  36.             if(type == "sfr")
  37.             {
  38.                 cout << "SFR(" << name << ", "  << addr << ");";
  39.                 if(haveComment) cout << comment;
  40.                 cout << endl;
  41.                 previous_addr = addr;
  42.             }
  43.             else if(type == "sbit")
  44.             {
  45.                 string bit_offset = addr.substr(addr.length()-1);

  46.                 cout << "SBIT(" << name << ", "  << previous_addr << ", " << bit_offset << ");";
  47.                 if(haveComment) cout << comment;
  48.                 cout << endl;
  49.             }

  50.         }
  51.     }
  52.     return 0;
  53. }
复制代码
(160010930)

打赏出0元收入0元

发表于 2015-6-13 22:33:21 | 显示全部楼层
SDCC标准51头文件不够用么?没搞明白
(159952228)

打赏出0元收入0元

 楼主| 发表于 2015-6-14 14:51:43 | 显示全部楼层
mowin 发表于 2015-6-13 22:33
SDCC标准51头文件不够用么?没搞明白

有些寄存器没有的。懒得一个一个添加了,干脆一劳永逸。
(159942706)

打赏出0元收入0元

发表于 2015-6-14 17:30:25 | 显示全部楼层
就一个支持C的单片机,楼主想多了。
(159933450)

打赏出0元收入0元

发表于 2015-6-14 20:04:41 | 显示全部楼层
就是关键字转换嘛
(12695089)

打赏出0元收入0元

发表于 2020-2-12 23:37:22 | 显示全部楼层
发现protues 8.9里面内置了一个STC的模型可以仿真的,又不想装keil,放狗一搜搜到这个帖子.
不搞CPP,电脑上连C++环境都没有,花了半个小时现场撸了一套MinGW编译出来试了一下
关键是,不能用啊LZ同学~

自己用c#撸了一个,替LZ把这个坑填了~
同时提供一个预编译过的,把头文件拖上去就行了,需要.net 4.5以上的运行库支撑.
不保证好使,只用了一个STC软件里面导出的头文件做了测试~

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;

  7. namespace Keil2SDCC
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             if(args.Length < 1)
  14.             {
  15.                 Console.WriteLine("Input Is Empty");
  16.                 Console.ReadKey();
  17.                 return ;
  18.             }

  19.             List<string> fileNames = new List<string>(args);
  20.             Dictionary<string, string> nameAddr = new Dictionary<string, string>();
  21.             foreach (var item in fileNames)
  22.             {
  23.                 var encodeType = GetFileEncodeType(item);

  24.                 if(item.EndsWith(".h") || item.EndsWith(".H"))
  25.                 {
  26.                     string realName = item.Substring(0, item.Length - 2);
  27.                     var lines = File.ReadAllLines(item,encodeType);
  28.                     var newLines = new  List<string>();

  29.                     foreach (var line in lines)
  30.                     {
  31.                         if(line.StartsWith("sfr"))
  32.                         {
  33.                             //sfr ACC = 0xE0;   //0000,0000 累加器Accumulator
  34.                             //0    1  2  3      4
  35.                             //__sfr __at (0x80) P0           ;  /* PORT 0                                                  */
  36.                             //0     1     2     3               4   


  37.                             var arr = line.Split(' ');
  38.                             arr[0] = "";
  39.                             int index = 0;
  40.                             string addr="", name="",comment="";
  41.                             for (int i = 0; i < arr.Length; i++)
  42.                             {
  43.                                 if (arr[i] != "")
  44.                                 {
  45.                                     index++;
  46.                                     if (index == 1) name = arr[i];
  47.                                     if (index == 3) addr = arr[i].Substring(0,arr[i].Length-1);
  48.                                     if (index > 3) comment += arr[i];
  49.                                 }
  50.                             }
  51.                             nameAddr.Add(name, addr);
  52.                             string newLineTmp = $"__sfr __at ({addr}) {name};  {comment}";
  53.                             newLines.Add(newLineTmp);
  54.                         }
  55.                         else if(line.StartsWith("sbit"))
  56.                         {
  57.                             //sbit P00        =   P0^0;
  58.                             //0     1         2     3       4     
  59.                             //__sbit __at (0x90) P1_0;
  60.                             //0      1      2       3      
  61.                             var arr = line.Split(' ');
  62.                             arr[0] = "";
  63.                             int index = 0;
  64.                             string addr = "", name = "", comment = "";
  65.                             for (int i = 0; i < arr.Length; i++)
  66.                             {
  67.                                 if (arr[i] != "")
  68.                                 {
  69.                                     index++;
  70.                                     if (index == 1) name = arr[i];
  71.                                     if (index == 3) addr = sbitGetAddr(arr[i],nameAddr);
  72.                                     if (index > 3) comment += arr[i];
  73.                                 }
  74.                             }
  75.                             string newLineTmp = $"__sbit __at ({addr}) {name} ; {comment}";
  76.                             newLines.Add(newLineTmp);
  77.                         }
  78.                         else
  79.                         {
  80.                             newLines.Add(line);
  81.                         }
  82.                     }
  83.                     File.WriteAllLines(realName + "4SDCC.h", newLines.ToArray());
  84.                 }
  85.             }
  86.         }

  87.         static string sbitGetAddr(string name,Dictionary<string,string> dic)
  88.         {
  89.             var valueArr = name.Split('^');
  90.             string addrBase = valueArr[0];
  91.             string addrOffset = valueArr[1].Substring(0, valueArr[1].Length - 1);

  92.             string tBase = dic[addrBase];
  93.             char lastChar = tBase.Last();
  94.             int offset = (int)lastChar - 0x30;
  95.             if (offset < 8)
  96.             {
  97.                 string tRes = tBase.Substring(0, tBase.Length - 1) + addrOffset;
  98.                 return tRes;
  99.             }
  100.             else
  101.             {
  102.                 var tt = 8 + Convert.ToByte(addrOffset);
  103.                 string ttt = tt.ToString("x");
  104.                 string tRes = tBase.Substring(0, tBase.Length - 1) + ttt;
  105.                 return tRes;
  106.             }

  107.         }

  108.         static System.Text.Encoding GetFileEncodeType(string filename)
  109.         {
  110.             using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read))
  111.             {
  112.                 System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
  113.                 byte[] buffer = br.ReadBytes(2);

  114.                 if (buffer[0] >= 0xEF)
  115.                 {
  116.                     if (buffer[0] == 0xEF && buffer[1] == 0xBB)
  117.                     {
  118.                         return System.Text.Encoding.UTF8;
  119.                     }
  120.                     else if (buffer[0] == 0xFE && buffer[1] == 0xFF)
  121.                     {
  122.                         return System.Text.Encoding.BigEndianUnicode;
  123.                     }
  124.                     else if (buffer[0] == 0xFF && buffer[1] == 0xFE)
  125.                     {
  126.                         return System.Text.Encoding.Unicode;
  127.                     }
  128.                     else
  129.                     {
  130.                         return System.Text.Encoding.Default;
  131.                     }
  132.                 }
  133.                 else
  134.                 {
  135.                     return System.Text.Encoding.Default;
  136.                 }
  137.             }
  138.         }

  139.     }
  140. }
复制代码


Debug.zip (9.76 KB)
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-8 22:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表