From a0a57a74cc301468d21f11cd5d78a272cce561b5 Mon Sep 17 00:00:00 2001 From: DawnManget Date: Mon, 9 May 2022 22:24:35 +0800 Subject: add keil-c51 toolchain & rules --- xmake/modules/core/tools/bl51.lua | 61 +++++++++++ xmake/modules/core/tools/c51.lua | 178 +++++++++++++++++++++++++++++++ xmake/modules/core/tools/oh51.lua | 61 +++++++++++ xmake/modules/detect/sdks/find_c51.lua | 124 +++++++++++++++++++++ xmake/modules/detect/tools/find_bl51.lua | 80 ++++++++++++++ xmake/modules/detect/tools/find_c51.lua | 73 +++++++++++++ xmake/modules/detect/tools/find_oh51.lua | 87 +++++++++++++++ xmake/rules/c51/xmake.lua | 21 ++++ xmake/toolchains/c51/xmake.lua | 50 +++++++++ 9 files changed, 735 insertions(+) create mode 100644 xmake/modules/core/tools/bl51.lua create mode 100644 xmake/modules/core/tools/c51.lua create mode 100644 xmake/modules/core/tools/oh51.lua create mode 100644 xmake/modules/detect/sdks/find_c51.lua create mode 100644 xmake/modules/detect/tools/find_bl51.lua create mode 100644 xmake/modules/detect/tools/find_c51.lua create mode 100644 xmake/modules/detect/tools/find_oh51.lua create mode 100644 xmake/rules/c51/xmake.lua create mode 100644 xmake/toolchains/c51/xmake.lua diff --git a/xmake/modules/core/tools/bl51.lua b/xmake/modules/core/tools/bl51.lua new file mode 100644 index 000000000..3b49bf0e3 --- /dev/null +++ b/xmake/modules/core/tools/bl51.lua @@ -0,0 +1,61 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author DawnMagnet +-- @file bl51.lua +-- + +-- imports +import("core.base.option") +import("core.base.global") +import("utils.progress") + +function init(self) +end +-- +---- make the link flag +--function nf_link(self, lib) +-- return "lib" .. lib .. ".a" +--end +-- +---- make the syslink flag +--function nf_syslink(self, lib) +-- return nf_link(self, lib) +--end +-- +---- make the linkdir flag +--function nf_linkdir(self, dir) +-- return {"--userlibpath", dir} +--end +-- +---- make runtime flag +--function nf_runtime(self, runtime) +-- if runtime == "microlib" then +-- return "--library_type=microlib" +-- end +--end +-- +-- make the link arguments list +function linkargv(self, objectfiles, targetkind, targetfile, flags) + return self:program(), table.join(objectfiles, "TO", targetfile) +end + +-- link the target file +function link(self, objectfiles, targetkind, targetfile, flags) + os.mkdir(path.directory(targetfile)) + os.runv(linkargv(self, objectfiles, targetkind, targetfile, flags)) +end + diff --git a/xmake/modules/core/tools/c51.lua b/xmake/modules/core/tools/c51.lua new file mode 100644 index 000000000..31f09188c --- /dev/null +++ b/xmake/modules/core/tools/c51.lua @@ -0,0 +1,178 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author DawnMagnet +-- @file c51.lua +-- + +-- imports +import("core.base.option") +import("core.base.global") +import("core.language.language") +import("utils.progress") + +-- init it +function init(self) +end +-- +---- make the symbol flag +--function nf_symbol(self, level) +-- -- only for source kind +-- local kind = self:kind() +-- if language.sourcekinds()[kind] then +-- local maps = _g.symbol_maps +-- if not maps then +-- maps = +-- { +-- debug = "-g" +-- } +-- _g.symbol_maps = maps +-- end +-- return maps[level .. '_' .. kind] or maps[level] +-- end +--end +-- +---- make the optimize flag +--function nf_optimize(self, level) +-- local maps = +-- { +-- none = "-O0" +-- , fast = "-O1" +-- , faster = "-O2" +-- , fastest = "-O3" +-- , smallest = "-Os" +-- , aggressive = "-Ofast" +-- } +-- return maps[level] +--end +-- +---- make the language flag +--function nf_language(self, stdname) +-- +-- -- the stdc maps +-- if _g.cmaps == nil then +-- _g.cmaps = +-- { +-- ansi = "-c89" +-- , c89 = "-c89" +-- , gnu89 = "-c89" +-- , c99 = "-c99" +-- , gnu99 = "-c99" +-- , c11 = "-c11" +-- , gnu11 = "-c11" +-- , clatest = {"-c11", "-c99", "-c89"} +-- , gnulatest = {"-c11", "-c99", "-c89"} +-- } +-- end +-- local maps = _g.cmaps +-- local result = maps[stdname] +-- if type(result) == "table" then +-- for _, v in ipairs(result) do +-- if self:has_flags(v, "cxflags") then +-- result = v +-- maps[stdname] = result +-- return result +-- end +-- end +-- else +-- return result +-- end +--end +-- +---- make the define flag +--function nf_define(self, macro) +-- return "-D" .. macro +--end +-- +---- make the undefine flag +--function nf_undefine(self, macro) +-- return "-U" .. macro +--end +-- +---- make the includedir flag +--function nf_includedir(self, dir) +-- return {"-I" .. dir} +--end +-- +---- make the sysincludedir flag +--function nf_sysincludedir(self, dir) +-- return nf_includedir(self, dir) +--end +-- + +-- compile the source file + +---- make the compile arguments list +function compargv(self, sourcefile, objectfile, flags) + return self:program(), table.join(sourcefile, flags) +end +function compile(self, sourcefile, objectfile, dependinfo, flags) + + -- ensure the object directory + os.mkdir(path.directory(objectfile)) + + -- compile it + try + { + function () + local realsourcefile = string.gsub(objectfile, "\\.obj$", "") + os.cp(sourcefile, realsourcefile) + local outdata, errdata = os.iorunv(compargv(self, realsourcefile, objectfile, dependinfo, flags)) + return (outdata or "") .. (errdata or "") + end, + catch + { + function (errors) + + -- try removing the old object file for forcing to rebuild this source file + os.tryrm(objectfile) + + -- find the start line of error + local lines = tostring(errors):split("\n") + local start = 0 + for index, line in ipairs(lines) do + if line:find("error:", 1, true) or line:find("错误:", 1, true) then + start = index + break + end + end + + -- get 16 lines of errors + if start > 0 or not option.get("verbose") then + if start == 0 then start = 1 end + errors = table.concat(table.slice(lines, start, start + ((#lines - start > 16) and 16 or (#lines - start))), "\n") + end + + -- raise compiling errors + raise(errors) + end + }, + finally + { + function (ok, warnings) + + -- print some warnings + if warnings and #warnings > 0 and (option.get("verbose") or option.get("warning") or global.get("build_warning")) then + if progress.showing_without_scroll() then + print("") + end + cprint("${color.warning}%s", table.concat(table.slice(warnings:split('\n'), 1, 8), '\n')) + end + end + } + } +end + diff --git a/xmake/modules/core/tools/oh51.lua b/xmake/modules/core/tools/oh51.lua new file mode 100644 index 000000000..2db696488 --- /dev/null +++ b/xmake/modules/core/tools/oh51.lua @@ -0,0 +1,61 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author DawnMagnet +-- @file oh51.lua +-- OBJECT TO HEX FILE CONVERTER OH51 V2.7.0.0 + +-- imports +import("core.tool.compiler") +import("utils.progress") + +-- init it +function init(self) +end + +-- make the strip flag +function strip(self, level) + local maps = + { + debug = "-S" + , all = "-s" + } + return maps[level] +end + +-- make the link arguments list +function linkargv(self, objectfiles, targetkind, targetfile, flags, opt) + opt = opt or {} + local argv = table.join(flags, targetfile, objectfiles) + if is_host("windows") and not opt.rawargs then + argv = winos.cmdargv(argv, {escape = true}) + end + return self:program(), argv +end + +-- link the library file +function link(self, objectfiles, targetkind, targetfile, flags) + os.mkdir(path.directory(targetfile)) + + -- @note remove the previous archived file first to force recreating a new file + os.tryrm(targetfile) + + -- link it + local program, argv = linkargv(self, objectfiles, targetkind, targetfile, flags) + os.runv(program, argv, {envs = self:runenvs()}) +end + + diff --git a/xmake/modules/detect/sdks/find_c51.lua b/xmake/modules/detect/sdks/find_c51.lua new file mode 100644 index 000000000..3de478507 --- /dev/null +++ b/xmake/modules/detect/sdks/find_c51.lua @@ -0,0 +1,124 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- Based On template file xmake\modules\detect\sdks\find_mdk.lua +-- +-- @author DawnMagnet +-- @file find_c51.lua +-- + +-- imports +import("lib.detect.find_path") +import("core.base.option") +import("core.base.semver") +import("core.project.config") +import("core.cache.detectcache") + +-- find C51 directory +function _find_sdkdir(sdkdir) + local paths = { + "$(reg HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Keil\\Products\\C51;Path)" + } + if sdkdir then + table.insert(paths, 1, sdkdir) + end + local result = find_path("C51", paths) + if not result then + -- find it from some logical drives paths + paths = {} + for _, logical_drive in ipairs(winos.logical_drives()) do + table.insert(paths, path.join(logical_drive, "Keil_v5", "C51", "BIN")) + end + result = find_path("C51.exe", paths) + end + return result +end + +-- find C51 toolchains +function _find_c51(sdkdir) + -- find C51 directory + sdkdir = _find_sdkdir(sdkdir) + if not sdkdir or not os.isdir(sdkdir) then + return nil + end + local result = {sdkdir = sdkdir} + + -- get sdk version + local sdkver = winos.registry_query("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Keil\\Products\\C51;Version") + if sdkver then + sdkver = semver.match(sdkver, 1, "V%d+%.%d+") + if sdkver then + result.sdkver = sdkver:rawstr() + end + end + + -- c51(exe) sdk directory + local sdkdir_c51 = path.join(sdkdir, "c51") + if os.isdir(sdkdir_c51) and os.isfile(path.join(sdkdir_c51, "bin", "c51.exe")) then + result.sdkdir_c51 = sdkdir_c51 + end + + -- a51 sdk directory + local sdkdir_a51 = path.join(sdkdir, "a51") + if os.isdir(sdkdir_a51) and os.isfile(path.join(sdkdir_a51, "bin", "a51.exe")) then + result.sdkdir_a51 = sdkdir_a51 + end + return result +end + +-- find c51 toolchains +-- +-- @param sdkdir the C51 directory +-- @param opt the argument options, e.g. {verbose = true, force = false} +-- +-- @return the C51 toolchains. e.g. {sdkver = ..., sdkdir, sdkdir_armcc, sdkdir_armclang, sdkdir_c51} +-- +-- @code +-- +-- local toolchains = find_c51("~/c51") +-- +-- @endcode +-- +function main(sdkdir, opt) + + -- init arguments + opt = opt or {} + + -- attempt to load cache first + local key = "detect.sdks.find_c51" + + local cacheinfo = detectcache:get(key) or {} + if not opt.force and cacheinfo.c51 and cacheinfo.c51.sdkdir and os.isdir(cacheinfo.c51.sdkdir) then + return cacheinfo.c51 + end + + -- find c51 + local c51 = _find_c51(sdkdir or config.get("sdk")) + if c51 then + if opt.verbose or option.get("verbose") then + cprint("checking for c51 directory ... ${color.success}%s", c51.sdkdir) + end + else + if opt.verbose or option.get("verbose") then + cprint("checking for c51 directory ... ${color.nothing}${text.nothing}") + end + end + + -- save to cache + cacheinfo.c51 = c51 or false + detectcache:set(key, cacheinfo) + detectcache:save() + return c51 +end \ No newline at end of file diff --git a/xmake/modules/detect/tools/find_bl51.lua b/xmake/modules/detect/tools/find_bl51.lua new file mode 100644 index 000000000..d44a1eb3c --- /dev/null +++ b/xmake/modules/detect/tools/find_bl51.lua @@ -0,0 +1,80 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author DawnMagnet +-- @file find_bl51.lua + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +import("detect.sdks.find_c51") + +function _check(program) + import("detect.tools.find_c51") + -- make temp source file + local c51 = assert(find_c51()) + local temp_prefix = os.tmpfile() + local cfile = temp_prefix .. ".c" + local objfile = temp_prefix .. ".obj" + local lstfile = temp_prefix .. ".lst" + local tmpfile = "." .. temp_prefix .. ".un~" + local binfile = temp_prefix .. "" + local m51file = temp_prefix .. ".m51" + -- write test code + io.writefile(cfile, "void main() {}") + -- archive it + os.runv(c51, {cfile}) + os.runv(program, {objfile, "TO", binfile}) + -- remove files + os.rm(cfile) + os.rm(objfile) + os.rm(lstfile) + os.rm(tmpfile) + os.rm(binfile) + os.rm(m51file) +end +-- find bl51 +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local bl51 = find_bl51() +-- local bl51, version = find_bl51() +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + opt.check = opt.check or _check + local program = find_program(opt.program or "bl51.exe", opt) + if not program then + local c51 = find_c51() + if c51 then + if c51.sdkdir_c51 then + program = find_program(path.join(c51.sdkdir_c51, "bin", "bl51.exe"), opt) + end + if not program and c51.sdkdir_a51 then + program = find_program(path.join(c51.sdkdir_a51, "bin", "bl51.exe"), opt) + end + end + end + return program, nil +end \ No newline at end of file diff --git a/xmake/modules/detect/tools/find_c51.lua b/xmake/modules/detect/tools/find_c51.lua new file mode 100644 index 000000000..954f03df6 --- /dev/null +++ b/xmake/modules/detect/tools/find_c51.lua @@ -0,0 +1,73 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author DawnMagnet +-- @file find_c51.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +local c51_module = import("detect.sdks.find_c51") + +function _check(program) + -- make temp source file + local cfile = os.tmpfile() .. ".c" + local objfile = os.tmpfile() .. ".obj" + local lstfile = os.tmpfile() .. ".c" + local tmpfile = "." .. os.tmpfile() .. ".un~" + -- write test code + io.writefile(cfile, "void main() {}") + -- archive it + os.runv(program, {cfile}) + -- remove files + os.rm(cfile) + os.rm(objfile) + os.rm(lstfile) + os.rm(tmpfile) +end +-- find c51 +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local c51 = find_c51() +-- local c51, version = find_c51() +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + opt.check = opt.check or _check + local program = find_program(opt.program or "c51.exe", opt) + if not program then + local c51_module = c51_module.find_c51() + if c51_module then + if c51_module.sdkdir_c51 then + program = find_program(path.join(c51_module.sdkdir_c51, "bin", "c51.exe"), opt) + end + if not program and c51_module.sdkdir_a51 then + program = find_program(path.join(c51_module.sdkdir_a51, "bin", "c51.exe"), opt) + end + end + end + return program, nil +end \ No newline at end of file diff --git a/xmake/modules/detect/tools/find_oh51.lua b/xmake/modules/detect/tools/find_oh51.lua new file mode 100644 index 000000000..df2a985b8 --- /dev/null +++ b/xmake/modules/detect/tools/find_oh51.lua @@ -0,0 +1,87 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author DawnMagnet +-- @file find_oh51.lua +-- OBJECT TO HEX FILE CONVERTER OH51 + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +import("detect.sdks.find_c51") + +function _check(program) + import("detect.tools.find_c51") + import("detect.tools.find_bl51") + + -- make temp source file + local c51 = assert(find_c51()) + local bl51 = assert(find_bl51()) + local temp_prefix = os.tmpfile() + local cfile = temp_prefix .. ".c" + local objfile = temp_prefix .. ".obj" + local lstfile = temp_prefix .. ".lst" + local tmpfile = "." .. temp_prefix .. ".un~" + local binfile = temp_prefix .. "" + local m51file = temp_prefix .. ".m51" + local hexfile = temp_prefix .. ".hex" + -- write test code + io.writefile(cfile, "void main() {}") + -- archive it + os.runv(c51, {cfile}) + os.runv(bl51, {objfile, "TO", binfile}) + os.runv(program, {binfile}) + -- remove files + os.rm(cfile) + os.rm(objfile) + os.rm(lstfile) + os.rm(tmpfile) + os.rm(binfile) + os.rm(m51file) + os.rm(hexfile) +end +-- find oh51 +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local oh51 = find_oh51() +-- local oh51, version = find_oh51() +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + opt.check = opt.check or _check + local program = find_program(opt.program or "oh51.exe", opt) + if not program then + local c51 = find_c51() + if c51 then + if c51.sdkdir_c51 then + program = find_program(path.join(c51.sdkdir_c51, "bin", "oh51.exe"), opt) + end + if not program and c51.sdkdir_a51 then + program = find_program(path.join(c51.sdkdir_a51, "bin", "oh51.exe"), opt) + end + end + end + return program, nil +end \ No newline at end of file diff --git a/xmake/rules/c51/xmake.lua b/xmake/rules/c51/xmake.lua new file mode 100644 index 000000000..5f47de159 --- /dev/null +++ b/xmake/rules/c51/xmake.lua @@ -0,0 +1,21 @@ +rule("c51.static") + on_load(function (target) + + + -- we disable checking flags for cross toolchain automatically + target:set("policy", "check.auto_ignore_flags", false) + target:set("policy", "check.auto_map_flags", false) + + -- set default output binary + target:set("kind", "binary") + if not target:get("extension") then + target:set("extension", "") + end + end) + + after_link(function(target) + import("detect.tools.find_oh51") + oh = find_oh51() + os.iorunv(oh, {target:targetfile()}) + cprint("${color.warning} hex file generated %s", target:targetfile() .. ".hex") + end) \ No newline at end of file diff --git a/xmake/toolchains/c51/xmake.lua b/xmake/toolchains/c51/xmake.lua new file mode 100644 index 000000000..fd6ef11dd --- /dev/null +++ b/xmake/toolchains/c51/xmake.lua @@ -0,0 +1,50 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author DawnMagnet +-- @file xmake.lua +-- + +toolchain("c51") + +set_homepage("https://www.keil.com/c51/") +set_description("Keil development tools for the 8051 Microcontroller Architecture") + +set_kind("cross") +set_kind("standalone") + +set_toolset("cc", "c51") +set_toolset("cxx", "c51") +set_toolset("ld", "bl51") +--set_toolset("ar", "oh51") +--set_toolset("ex", "armar") +--set_toolset("as", "a51") + +on_check(function (toolchain) + --import("lib.detect.find_tool") + import("detect.sdks.find_c51") + local c51_module = find_c51() + import("detect.tools.find_c51") + if c51_module and c51_module.sdkdir and find_c51() then + toolchain:config_set("sdkdir", c51_module.sdkdir) + toolchain:configs_save() + return true + end +end) + + +on_load(function (toolchain) +end) \ No newline at end of file -- cgit v1.3.1 From 8d0fb42d11874dd59bac82b45d1ca81e0df01780 Mon Sep 17 00:00:00 2001 From: DawnManget Date: Tue, 10 May 2022 10:45:43 +0800 Subject: review: add keil-c51 toolchain & rules --- xmake/modules/core/tools/bl51.lua | 24 +-------- xmake/modules/core/tools/c51.lua | 93 ++------------------------------ xmake/modules/core/tools/oh51.lua | 61 --------------------- xmake/modules/detect/tools/find_bl51.lua | 25 ++++----- xmake/modules/detect/tools/find_c51.lua | 28 +++++----- xmake/modules/detect/tools/find_oh51.lua | 33 ++++-------- xmake/rules/c51/xmake.lua | 8 ++- xmake/toolchains/c51/xmake.lua | 41 ++++++-------- 8 files changed, 57 insertions(+), 256 deletions(-) delete mode 100644 xmake/modules/core/tools/oh51.lua diff --git a/xmake/modules/core/tools/bl51.lua b/xmake/modules/core/tools/bl51.lua index 3b49bf0e3..70c04385b 100644 --- a/xmake/modules/core/tools/bl51.lua +++ b/xmake/modules/core/tools/bl51.lua @@ -25,29 +25,7 @@ import("utils.progress") function init(self) end --- ----- make the link flag ---function nf_link(self, lib) --- return "lib" .. lib .. ".a" ---end --- ----- make the syslink flag ---function nf_syslink(self, lib) --- return nf_link(self, lib) ---end --- ----- make the linkdir flag ---function nf_linkdir(self, dir) --- return {"--userlibpath", dir} ---end --- ----- make runtime flag ---function nf_runtime(self, runtime) --- if runtime == "microlib" then --- return "--library_type=microlib" --- end ---end --- + -- make the link arguments list function linkargv(self, objectfiles, targetkind, targetfile, flags) return self:program(), table.join(objectfiles, "TO", targetfile) diff --git a/xmake/modules/core/tools/c51.lua b/xmake/modules/core/tools/c51.lua index 31f09188c..1c87bbb28 100644 --- a/xmake/modules/core/tools/c51.lua +++ b/xmake/modules/core/tools/c51.lua @@ -27,98 +27,13 @@ import("utils.progress") -- init it function init(self) end --- ----- make the symbol flag ---function nf_symbol(self, level) --- -- only for source kind --- local kind = self:kind() --- if language.sourcekinds()[kind] then --- local maps = _g.symbol_maps --- if not maps then --- maps = --- { --- debug = "-g" --- } --- _g.symbol_maps = maps --- end --- return maps[level .. '_' .. kind] or maps[level] --- end ---end --- ----- make the optimize flag ---function nf_optimize(self, level) --- local maps = --- { --- none = "-O0" --- , fast = "-O1" --- , faster = "-O2" --- , fastest = "-O3" --- , smallest = "-Os" --- , aggressive = "-Ofast" --- } --- return maps[level] ---end --- ----- make the language flag ---function nf_language(self, stdname) --- --- -- the stdc maps --- if _g.cmaps == nil then --- _g.cmaps = --- { --- ansi = "-c89" --- , c89 = "-c89" --- , gnu89 = "-c89" --- , c99 = "-c99" --- , gnu99 = "-c99" --- , c11 = "-c11" --- , gnu11 = "-c11" --- , clatest = {"-c11", "-c99", "-c89"} --- , gnulatest = {"-c11", "-c99", "-c89"} --- } --- end --- local maps = _g.cmaps --- local result = maps[stdname] --- if type(result) == "table" then --- for _, v in ipairs(result) do --- if self:has_flags(v, "cxflags") then --- result = v --- maps[stdname] = result --- return result --- end --- end --- else --- return result --- end ---end --- ----- make the define flag ---function nf_define(self, macro) --- return "-D" .. macro ---end --- ----- make the undefine flag ---function nf_undefine(self, macro) --- return "-U" .. macro ---end --- ----- make the includedir flag ---function nf_includedir(self, dir) --- return {"-I" .. dir} ---end --- ----- make the sysincludedir flag ---function nf_sysincludedir(self, dir) --- return nf_includedir(self, dir) ---end --- - --- compile the source file ----- make the compile arguments list +-- make the compile arguments list function compargv(self, sourcefile, objectfile, flags) return self:program(), table.join(sourcefile, flags) end + +-- compile the source file function compile(self, sourcefile, objectfile, dependinfo, flags) -- ensure the object directory @@ -128,7 +43,7 @@ function compile(self, sourcefile, objectfile, dependinfo, flags) try { function () - local realsourcefile = string.gsub(objectfile, "\\.obj$", "") + local realsourcefile = objectfile:gsub("\\.obj$", "") os.cp(sourcefile, realsourcefile) local outdata, errdata = os.iorunv(compargv(self, realsourcefile, objectfile, dependinfo, flags)) return (outdata or "") .. (errdata or "") diff --git a/xmake/modules/core/tools/oh51.lua b/xmake/modules/core/tools/oh51.lua deleted file mode 100644 index 2db696488..000000000 --- a/xmake/modules/core/tools/oh51.lua +++ /dev/null @@ -1,61 +0,0 @@ ---!A cross-platform build utility based on Lua --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- --- Copyright (C) 2015-present, TBOOX Open Source Group. --- --- @author DawnMagnet --- @file oh51.lua --- OBJECT TO HEX FILE CONVERTER OH51 V2.7.0.0 - --- imports -import("core.tool.compiler") -import("utils.progress") - --- init it -function init(self) -end - --- make the strip flag -function strip(self, level) - local maps = - { - debug = "-S" - , all = "-s" - } - return maps[level] -end - --- make the link arguments list -function linkargv(self, objectfiles, targetkind, targetfile, flags, opt) - opt = opt or {} - local argv = table.join(flags, targetfile, objectfiles) - if is_host("windows") and not opt.rawargs then - argv = winos.cmdargv(argv, {escape = true}) - end - return self:program(), argv -end - --- link the library file -function link(self, objectfiles, targetkind, targetfile, flags) - os.mkdir(path.directory(targetfile)) - - -- @note remove the previous archived file first to force recreating a new file - os.tryrm(targetfile) - - -- link it - local program, argv = linkargv(self, objectfiles, targetkind, targetfile, flags) - os.runv(program, argv, {envs = self:runenvs()}) -end - - diff --git a/xmake/modules/detect/tools/find_bl51.lua b/xmake/modules/detect/tools/find_bl51.lua index d44a1eb3c..001d1ed13 100644 --- a/xmake/modules/detect/tools/find_bl51.lua +++ b/xmake/modules/detect/tools/find_bl51.lua @@ -21,30 +21,23 @@ import("lib.detect.find_program") import("lib.detect.find_programver") import("detect.sdks.find_c51") +import("lib.detect.find_tool") function _check(program) - import("detect.tools.find_c51") + local c51 = assert(find_tool("c51"), "c51 not found") -- make temp source file - local c51 = assert(find_c51()) - local temp_prefix = os.tmpfile() - local cfile = temp_prefix .. ".c" - local objfile = temp_prefix .. ".obj" - local lstfile = temp_prefix .. ".lst" - local tmpfile = "." .. temp_prefix .. ".un~" - local binfile = temp_prefix .. "" - local m51file = temp_prefix .. ".m51" + local tmpdir = os.tmpfile() + os.mkdir(tmpdir) + local cfile = path.join(tmpdir, "test.c") + local objfile = path.join(tmpdir, "test.obj") + local binfile = path.join(tmpdir, "test") -- write test code io.writefile(cfile, "void main() {}") -- archive it - os.runv(c51, {cfile}) + os.runv(c51.program, {cfile}) os.runv(program, {objfile, "TO", binfile}) -- remove files - os.rm(cfile) - os.rm(objfile) - os.rm(lstfile) - os.rm(tmpfile) - os.rm(binfile) - os.rm(m51file) + os.rmdir(tmpdir) end -- find bl51 -- diff --git a/xmake/modules/detect/tools/find_c51.lua b/xmake/modules/detect/tools/find_c51.lua index 954f03df6..616b81a4d 100644 --- a/xmake/modules/detect/tools/find_c51.lua +++ b/xmake/modules/detect/tools/find_c51.lua @@ -21,23 +21,19 @@ -- imports import("lib.detect.find_program") import("lib.detect.find_programver") -local c51_module = import("detect.sdks.find_c51") +import("detect.sdks.find_c51") function _check(program) -- make temp source file - local cfile = os.tmpfile() .. ".c" - local objfile = os.tmpfile() .. ".obj" - local lstfile = os.tmpfile() .. ".c" - local tmpfile = "." .. os.tmpfile() .. ".un~" + local tmpdir = os.tmpfile() + os.mkdir(tmpdir) + local cfile = path.join(tmpdir, "test.c") -- write test code io.writefile(cfile, "void main() {}") -- archive it os.runv(program, {cfile}) -- remove files - os.rm(cfile) - os.rm(objfile) - os.rm(lstfile) - os.rm(tmpfile) + os.rmdir(tmpdir) end -- find c51 -- @@ -57,15 +53,15 @@ function main(opt) -- init options opt = opt or {} opt.check = opt.check or _check - local program = find_program(opt.program or "c51.exe", opt) + local program = find_program(opt.program or "c51", opt) if not program then - local c51_module = c51_module.find_c51() - if c51_module then - if c51_module.sdkdir_c51 then - program = find_program(path.join(c51_module.sdkdir_c51, "bin", "c51.exe"), opt) + local c51 = find_c51() + if c51 then + if c51.sdkdir_c51 then + program = find_program(path.join(c51.sdkdir_c51, "bin", "c51"), opt) end - if not program and c51_module.sdkdir_a51 then - program = find_program(path.join(c51_module.sdkdir_a51, "bin", "c51.exe"), opt) + if not program and c51.sdkdir_a51 then + program = find_program(path.join(c51.sdkdir_a51, "bin", "c51"), opt) end end end diff --git a/xmake/modules/detect/tools/find_oh51.lua b/xmake/modules/detect/tools/find_oh51.lua index df2a985b8..dc3310efe 100644 --- a/xmake/modules/detect/tools/find_oh51.lua +++ b/xmake/modules/detect/tools/find_oh51.lua @@ -22,36 +22,25 @@ import("lib.detect.find_program") import("lib.detect.find_programver") import("detect.sdks.find_c51") +import("lib.detect.find_tool") function _check(program) - import("detect.tools.find_c51") - import("detect.tools.find_bl51") - + local c51 = assert(find_tool("c51"), "c51 not found") + local bl51 = assert(find_tool("bl51"), "bl51 not found") -- make temp source file - local c51 = assert(find_c51()) - local bl51 = assert(find_bl51()) - local temp_prefix = os.tmpfile() - local cfile = temp_prefix .. ".c" - local objfile = temp_prefix .. ".obj" - local lstfile = temp_prefix .. ".lst" - local tmpfile = "." .. temp_prefix .. ".un~" - local binfile = temp_prefix .. "" - local m51file = temp_prefix .. ".m51" - local hexfile = temp_prefix .. ".hex" + local tmpdir = os.tmpfile() + os.mkdir(tmpdir) + local cfile = path.join(tmpdir, "test.c") + local objfile = path.join(tmpdir, "test.obj") + local binfile = path.join(tmpdir, "test") -- write test code io.writefile(cfile, "void main() {}") -- archive it - os.runv(c51, {cfile}) - os.runv(bl51, {objfile, "TO", binfile}) + os.runv(c51.program, {cfile}) + os.runv(bl51.program, {objfile, "TO", binfile}) os.runv(program, {binfile}) -- remove files - os.rm(cfile) - os.rm(objfile) - os.rm(lstfile) - os.rm(tmpfile) - os.rm(binfile) - os.rm(m51file) - os.rm(hexfile) + os.rmdir(tmpdir) end -- find oh51 -- diff --git a/xmake/rules/c51/xmake.lua b/xmake/rules/c51/xmake.lua index 5f47de159..c274b2333 100644 --- a/xmake/rules/c51/xmake.lua +++ b/xmake/rules/c51/xmake.lua @@ -1,7 +1,5 @@ rule("c51.static") on_load(function (target) - - -- we disable checking flags for cross toolchain automatically target:set("policy", "check.auto_ignore_flags", false) target:set("policy", "check.auto_map_flags", false) @@ -14,8 +12,8 @@ rule("c51.static") end) after_link(function(target) - import("detect.tools.find_oh51") - oh = find_oh51() - os.iorunv(oh, {target:targetfile()}) + import("lib.detect.find_tool") + local oh = assert(find_tool("oh51"), "oh51 not found") + os.iorunv(oh.program, {target:targetfile()}) cprint("${color.warning} hex file generated %s", target:targetfile() .. ".hex") end) \ No newline at end of file diff --git a/xmake/toolchains/c51/xmake.lua b/xmake/toolchains/c51/xmake.lua index fd6ef11dd..dc24b02ac 100644 --- a/xmake/toolchains/c51/xmake.lua +++ b/xmake/toolchains/c51/xmake.lua @@ -20,31 +20,24 @@ toolchain("c51") -set_homepage("https://www.keil.com/c51/") -set_description("Keil development tools for the 8051 Microcontroller Architecture") + set_homepage("https://www.keil.com/c51/") + set_description("Keil development tools for the 8051 Microcontroller Architecture") -set_kind("cross") -set_kind("standalone") + set_kind("cross") + set_kind("standalone") -set_toolset("cc", "c51") -set_toolset("cxx", "c51") -set_toolset("ld", "bl51") ---set_toolset("ar", "oh51") ---set_toolset("ex", "armar") ---set_toolset("as", "a51") + set_toolset("cc", "c51") + set_toolset("cxx", "c51") + set_toolset("ld", "bl51") -on_check(function (toolchain) - --import("lib.detect.find_tool") - import("detect.sdks.find_c51") - local c51_module = find_c51() - import("detect.tools.find_c51") - if c51_module and c51_module.sdkdir and find_c51() then - toolchain:config_set("sdkdir", c51_module.sdkdir) - toolchain:configs_save() - return true - end -end) + on_check(function (toolchain) + import("lib.detect.find_tool") + import("detect.sdks.find_c51") + local c51 = find_c51() - -on_load(function (toolchain) -end) \ No newline at end of file + if c51 and c51.sdkdir and find_tool("c51") then + toolchain:config_set("sdkdir", c51.sdkdir) + toolchain:configs_save() + return true + end + end) \ No newline at end of file -- cgit v1.3.1 From 78c0715c5b79a2fcd94a8c808bffb22e60533c2b Mon Sep 17 00:00:00 2001 From: DawnManget Date: Tue, 10 May 2022 11:22:15 +0800 Subject: review2: add keil-c51 toolchain & rules --- xmake/modules/detect/tools/find_bl51.lua | 9 ++++++--- xmake/modules/detect/tools/find_c51.lua | 6 +++--- xmake/modules/detect/tools/find_oh51.lua | 8 ++++++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/xmake/modules/detect/tools/find_bl51.lua b/xmake/modules/detect/tools/find_bl51.lua index 001d1ed13..563db1271 100644 --- a/xmake/modules/detect/tools/find_bl51.lua +++ b/xmake/modules/detect/tools/find_bl51.lua @@ -25,17 +25,20 @@ import("lib.detect.find_tool") function _check(program) local c51 = assert(find_tool("c51"), "c51 not found") + -- make temp source file - local tmpdir = os.tmpfile() - os.mkdir(tmpdir) + local tmpdir = os.tmpfile() .. ".dir" local cfile = path.join(tmpdir, "test.c") local objfile = path.join(tmpdir, "test.obj") local binfile = path.join(tmpdir, "test") + -- write test code io.writefile(cfile, "void main() {}") + -- archive it - os.runv(c51.program, {cfile}) + os.runv(c51.program, {"test.c"}, {curdir = tmpdir}) os.runv(program, {objfile, "TO", binfile}) + -- remove files os.rmdir(tmpdir) end diff --git a/xmake/modules/detect/tools/find_c51.lua b/xmake/modules/detect/tools/find_c51.lua index 616b81a4d..743784f1a 100644 --- a/xmake/modules/detect/tools/find_c51.lua +++ b/xmake/modules/detect/tools/find_c51.lua @@ -25,13 +25,13 @@ import("detect.sdks.find_c51") function _check(program) -- make temp source file - local tmpdir = os.tmpfile() - os.mkdir(tmpdir) + local tmpdir = os.tmpfile() .. ".dir" local cfile = path.join(tmpdir, "test.c") + -- write test code io.writefile(cfile, "void main() {}") -- archive it - os.runv(program, {cfile}) + os.runv(program, {"test.c"}, {curdir = tmpdir}) -- remove files os.rmdir(tmpdir) end diff --git a/xmake/modules/detect/tools/find_oh51.lua b/xmake/modules/detect/tools/find_oh51.lua index dc3310efe..f81002a3e 100644 --- a/xmake/modules/detect/tools/find_oh51.lua +++ b/xmake/modules/detect/tools/find_oh51.lua @@ -27,18 +27,22 @@ import("lib.detect.find_tool") function _check(program) local c51 = assert(find_tool("c51"), "c51 not found") local bl51 = assert(find_tool("bl51"), "bl51 not found") + -- make temp source file - local tmpdir = os.tmpfile() + local tmpdir = os.tmpfile() .. ".dir" os.mkdir(tmpdir) local cfile = path.join(tmpdir, "test.c") local objfile = path.join(tmpdir, "test.obj") local binfile = path.join(tmpdir, "test") + -- write test code io.writefile(cfile, "void main() {}") + -- archive it - os.runv(c51.program, {cfile}) + os.runv(c51.program, {"test.c"}, {curdir = tmpdir}) os.runv(bl51.program, {objfile, "TO", binfile}) os.runv(program, {binfile}) + -- remove files os.rmdir(tmpdir) end -- cgit v1.3.1 From 4deeedb8c21e47cec0ad0b52739552c678a82cfd Mon Sep 17 00:00:00 2001 From: DawnManget Date: Tue, 10 May 2022 11:39:39 +0800 Subject: review3: add keil-c51 toolchain & rules --- xmake/rules/c51/xmake.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/xmake/rules/c51/xmake.lua b/xmake/rules/c51/xmake.lua index c274b2333..c9f65af55 100644 --- a/xmake/rules/c51/xmake.lua +++ b/xmake/rules/c51/xmake.lua @@ -11,9 +11,13 @@ rule("c51.static") end end) - after_link(function(target) - import("lib.detect.find_tool") - local oh = assert(find_tool("oh51"), "oh51 not found") - os.iorunv(oh.program, {target:targetfile()}) - cprint("${color.warning} hex file generated %s", target:targetfile() .. ".hex") + after_link(function(target, opt) + import("core.project.depend") + depend.on_changed(function() + import("lib.detect.find_tool") + import("utils.progress") + local oh = assert(find_tool("oh51"), "oh51 not found") + os.iorunv(oh.program, {target:targetfile()}) + progress.show(opt.progress, "${color.build.target}generating.$(mode) %s", target:targetfile() .. ".hex") + end, {files = {target:targetfile()}}) end) \ No newline at end of file -- cgit v1.3.1 From fdd33995a73e871d43409cdb541ebf1ec8cc300b Mon Sep 17 00:00:00 2001 From: DawnManget Date: Tue, 10 May 2022 11:52:42 +0800 Subject: review4: add keil-c51 toolchain & rules --- xmake/rules/c51/xmake.lua | 5 +++-- xmake/toolchains/c51/xmake.lua | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/xmake/rules/c51/xmake.lua b/xmake/rules/c51/xmake.lua index c9f65af55..44c2d3483 100644 --- a/xmake/rules/c51/xmake.lua +++ b/xmake/rules/c51/xmake.lua @@ -1,3 +1,4 @@ + rule("c51.static") on_load(function (target) -- we disable checking flags for cross toolchain automatically @@ -13,9 +14,9 @@ rule("c51.static") after_link(function(target, opt) import("core.project.depend") + import("lib.detect.find_tool") + import("utils.progress") depend.on_changed(function() - import("lib.detect.find_tool") - import("utils.progress") local oh = assert(find_tool("oh51"), "oh51 not found") os.iorunv(oh.program, {target:targetfile()}) progress.show(opt.progress, "${color.build.target}generating.$(mode) %s", target:targetfile() .. ".hex") diff --git a/xmake/toolchains/c51/xmake.lua b/xmake/toolchains/c51/xmake.lua index dc24b02ac..d0af24907 100644 --- a/xmake/toolchains/c51/xmake.lua +++ b/xmake/toolchains/c51/xmake.lua @@ -34,7 +34,6 @@ toolchain("c51") import("lib.detect.find_tool") import("detect.sdks.find_c51") local c51 = find_c51() - if c51 and c51.sdkdir and find_tool("c51") then toolchain:config_set("sdkdir", c51.sdkdir) toolchain:configs_save() -- cgit v1.3.1 From ef7924ec6f8368b096789d510f5890bb46989ea0 Mon Sep 17 00:00:00 2001 From: DawnManget Date: Tue, 10 May 2022 12:00:05 +0800 Subject: review5: add keil-c51 toolchain & rules --- xmake/rules/c51/xmake.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/xmake/rules/c51/xmake.lua b/xmake/rules/c51/xmake.lua index 44c2d3483..6e4654082 100644 --- a/xmake/rules/c51/xmake.lua +++ b/xmake/rules/c51/xmake.lua @@ -1,5 +1,4 @@ - -rule("c51.static") +rule("c51.binary") on_load(function (target) -- we disable checking flags for cross toolchain automatically target:set("policy", "check.auto_ignore_flags", false) -- cgit v1.3.1 From e3c89983b01d79a890aa22edc7e7ebb458984117 Mon Sep 17 00:00:00 2001 From: DawnManget Date: Tue, 10 May 2022 13:43:00 +0800 Subject: review6: add keil-c51 examples --- tests/projects/embed/c51/hello/src/main.c | 9 +++++++++ tests/projects/embed/c51/hello/xmake.lua | 4 ++++ 2 files changed, 13 insertions(+) create mode 100644 tests/projects/embed/c51/hello/src/main.c create mode 100644 tests/projects/embed/c51/hello/xmake.lua diff --git a/tests/projects/embed/c51/hello/src/main.c b/tests/projects/embed/c51/hello/src/main.c new file mode 100644 index 000000000..2c391f151 --- /dev/null +++ b/tests/projects/embed/c51/hello/src/main.c @@ -0,0 +1,9 @@ +// +// Created by DawnManget on 2022/5/10. +// +#include +sbit light = P0 ^ 3; +void main() { + light = 0; + while (1); +} \ No newline at end of file diff --git a/tests/projects/embed/c51/hello/xmake.lua b/tests/projects/embed/c51/hello/xmake.lua new file mode 100644 index 000000000..be1e170df --- /dev/null +++ b/tests/projects/embed/c51/hello/xmake.lua @@ -0,0 +1,4 @@ +target("hello") + add_rules("c51.binary") + set_toolchains("c51") + add_files("src/main.c") \ No newline at end of file -- cgit v1.3.1 From 4d6593defe107281cd02c660d621bc1e46c87443 Mon Sep 17 00:00:00 2001 From: DawnManget Date: Tue, 10 May 2022 13:45:10 +0800 Subject: review7: add keil-c51 examples --- tests/projects/embed/c51/hello/src/main.c | 55 +++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/tests/projects/embed/c51/hello/src/main.c b/tests/projects/embed/c51/hello/src/main.c index 2c391f151..296324e0a 100644 --- a/tests/projects/embed/c51/hello/src/main.c +++ b/tests/projects/embed/c51/hello/src/main.c @@ -1,9 +1,50 @@ -// -// Created by DawnManget on 2022/5/10. -// #include -sbit light = P0 ^ 3; -void main() { - light = 0; - while (1); + +#define REP(i, j) for(i = 0; i < j; ++i) +sbit control = P3 ^ 2; + +void delay_ms(unsigned int n) { + unsigned int i, j; + for (j = n; j > 0; j--) + for (i = 112; i > 0; i--); +} + +/*——————宏定义——————*/ +int i; + +void set(unsigned int x) { + P1 = x; + delay_ms(100); +} + +void left_fill() { + REP(i, 8) set(0xFF >> i); +} + +void right_fill() { + REP(i, 8) set((0xFF >> (7 - i)) ^ 0xFF); +} + +void left_erase() { + REP(i, 8) set((0xFF >> (7 - i))); +} + +void right_erase() { + REP(i, 8) set((0xFF >> i) ^ 0xFF); +} + +int main() { + P1 = 0xFF; + P3 = 0xFF; + while (1) { + if (control == 0) { + left_fill(); + left_erase(); + right_fill(); + right_erase(); + } else { + set(0x55); + set(0xAA); + } + } } \ No newline at end of file -- cgit v1.3.1 From 1f87afd7f19f754ae2206d0cfabdc739f81ff412 Mon Sep 17 00:00:00 2001 From: DawnManget Date: Tue, 10 May 2022 13:45:41 +0800 Subject: review7: add keil-c51 examples --- tests/projects/embed/c51/hello/src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/projects/embed/c51/hello/src/main.c b/tests/projects/embed/c51/hello/src/main.c index 296324e0a..bdab759d9 100644 --- a/tests/projects/embed/c51/hello/src/main.c +++ b/tests/projects/embed/c51/hello/src/main.c @@ -9,7 +9,7 @@ void delay_ms(unsigned int n) { for (i = 112; i > 0; i--); } -/*——————宏定义——————*/ + int i; void set(unsigned int x) { -- cgit v1.3.1