Ronan Blog

罗华东的博客 | 向前每多走一步,热爱和勇气就会多一分。

sdcc工程创建模版程序

2024-09-02 2 min read Tools Ronan

1.程序构建

新建一个txt文件并将以下代码复制到xxx.txt,之后将xxx.txt(例如sdccpj.txt)后缀名修改为.sh(例如sdccpj.sh)或者直接去掉后缀名只保留文件名(这在类linux系统中就是可执行程序)sdccpj

#!/usr/bin/env bash

# 检查是否提供了工程名参数
if [ -z "$1" ]; then
    echo "使用方法: sdccpj <工程名>"
    exit 1
fi

# 获取工程名
project_name=$1

# 创建工程根目录
if [ ! -d "$project_name" ]; then
    mkdir "$project_name"
else
    echo "根目录已存在: $project_name"
fi

# 创建子目录
for dir in src lib include build; do
    if [ ! -d "$project_name/$dir" ]; then
        mkdir "$project_name/$dir"
    else
        echo "子目录已存在: $project_name/$dir"
    fi
done

# 创建Makefile文件
if [ ! -e "${project_name}/Makefile" ]; then
    cat > ${project_name}/Makefile << EOF
# 定义编译器
CC = sdcc

# 定义源文件目录
SRC_DIR = src
LIB_DIR = lib

# 定义头文件目录
INCLUDE_DIR = include

# 定义生成文件目录
BUILD_DIR = build

# 定义所有源文件
SRC_FILES = \$(wildcard \$(SRC_DIR)/*.c)
LIB_FILES = \$(wildcard \$(LIB_DIR)/*.c)

# 定义目标文件
OBJ_FILES = \$(patsubst \$(SRC_DIR)/%.c, \$(BUILD_DIR)/%.rel, \$(SRC_FILES)) \\
            \$(patsubst \$(LIB_DIR)/%.c, \$(BUILD_DIR)/%.rel, \$(LIB_FILES))

# 定义最终生成的hex文件
OUTPUT_FILE = \$(BUILD_DIR)/out.hex

# 查找串口号
PORT = \$(wildcard (ls /dev/tty.wchusbserial* 2>/dev/null | head -n 1))

# 默认目标
all: \$(OUTPUT_FILE) post_build_cleanup

# 编译每一个.c文件生成.rel文件
\$(BUILD_DIR)/%.rel: \$(SRC_DIR)/%.c
	\$(CC) -I\$(INCLUDE_DIR) -c \$< -o \$@

\$(BUILD_DIR)/%.rel: \$(LIB_DIR)/%.c
	\$(CC) -I\$(INCLUDE_DIR) -c \$< -o \$@

# 链接所有.rel文件生成.hex文件
\$(OUTPUT_FILE): \$(OBJ_FILES)
	\$(CC) \$(OBJ_FILES) -o \$(OUTPUT_FILE)

# 定义一个伪目标,用于清理编译后生成的文件
.PHONY: post_build_cleanup
post_build_cleanup:
	-rm -f \$(BUILD_DIR)/*.asm \$(BUILD_DIR)/*.lst \$(BUILD_DIR)/*.rst \$(BUILD_DIR)/*.sym \$(BUILD_DIR)/*.lk \\
	\$(BUILD_DIR)/*.map \$(BUILD_DIR)/*.mem 
    @echo "构建成功,泰裤辣!可烧录文件out.hex已存放到build目录下"

# 定义一个clean目标,用于手动清理所有生成的文件
.PHONY: clean
clean:
	-rm -f \$(BUILD_DIR)/*.rel \$(BUILD_DIR)/*.hex
	-rm -f \$(BUILD_DIR)/*.asm \$(BUILD_DIR)/*.lst \$(BUILD_DIR)/*.rst \$(BUILD_DIR)/*.sym \$(BUILD_DIR)/*.lk \\
	\$(BUILD_DIR)/*.map \$(BUILD_DIR)/*.mem
	@echo "已成功清空了所有的生成文件..."

# 定义一个flash目标,用于手动烧录.hex文件
.PHONY: flash
flash:
	stcgal -p \$(PORT) -b 9600 \$(BUILD_DIR)/out.hex
EOF
else
    echo "Makefile 已存在: $project_name/Makefile"
fi

2.创建工程

通过在终端键入命令(以上述sdccpj为例)

Continue reading

Huxpro-Blog上传脚本

2024-09-02 2 min read Tools Ronan

用法

  • 在代码的最后几行空白引号里填入相应信息
  • 注意 create_new_file_in_the_repo 函数里的 branch="main" 参数,根据自身仓库分支修改
import os
from datetime import datetime
from github import Github

class HuxBlog:
    def __init__(self, owner=None, repo=None, token=None):
        self.owner = owner
        self.repo = repo
        self.token = token

        g = Github(self.token)
        self.repo = g.get_repo(f"{self.owner}/{self.repo}")

        # 检查是否提供了必要的参数
        if not self.owner or not self.repo or not self.token:
            raise ValueError("必须指定 owner, repo 和 token")
        else:
            self.start_upload()


    def start_upload(self):
        status = input("\n 1.上传单篇文章 \n 2.批量上传 \n 按下对应数字并回车可选择相应功能:")
        self.tags = input("请输入标签,用,隔开:")

        match status:
            case "1":
                post_path = input("请输入文章路径:")
                including_time_file_name, content = self.prepare_post_file(post_path)
                self.create_new_file_in_the_repo(including_time_file_name, content)
            case "2":
                post_paths = self.get_post_paths()
                for post_path in post_paths:
                    including_time_file_name, content = self.prepare_post_file(post_path)
                    self.create_new_file_in_the_repo(including_time_file_name, content)


    def create_new_file_in_the_repo(self, file_path, content):
        # 第一个参数:要上传到仓库的哪个路径; 第二个参数:commit 信息; 第三个参数:上传文档正文; 第四个参数:上传的分支
        self.repo.create_file(f"{file_path}", f"Added {file_path}", content, branch="main")

    def get_post_paths(self):
        directory = input("请输入文章目录:")

        file_paths = []

        for filename in os.listdir(directory):
            if filename.endswith('.md') or filename.endswith('.txt'):
                # 包含前缀路径的文件路径
                file_path = os.path.join(directory, filename)
                file_paths.append(file_path)

        return file_paths


    def prepare_post_file(self, post_path:str) -> tuple[_posts/YYYY-MM-DD-file.md:str, front_matter + source_body:str]:

        # 获取当前日期并格式化为“YYYY-MM-DD-”
        current_date = datetime.now().strftime('%Y-%m-%d')

        title = os.path.splitext(os.path.basename(post_path))[0]

        # 检查文件名是否已经以“YYYY-MM-DD-”格式开头
        if title.startswith(current_date):
            print(f"{post_path}的文件名已包含日期,如需继续上传请先清除文件名前的日期")
        else:
            # file.md 所在的目录 “/root/path”
            dir_name, base_name = os.path.split(post_path)
            # 无后缀名的 file
            file_name, file_ext = os.path.splitext(base_name)

            # 构建 YYYY-MM-DD-file.md ,没有前置路径
            over_time_name = f"_posts/{current_date}-{file_name}{file_ext}"
            # 构建/root/path/YYYY-MM-DD-file.md
            absolute_path_file = os.path.join(dir_name, over_time_name)


        tag_list = [tag.strip() for tag in self.tags.split(',')]

        # 生成前言部分
        front_matter = f"""---
layout: post
title: "{title}"
author: "Ronan"
header-style: text
tags:
"""
        for tag in tag_list:
            front_matter += f"  - {tag}\n"

        front_matter += "---\n\n"

        # 读取源文件内容
        with open(post_path, "r", encoding='utf-8') as f:
            source_body = f.read()

        # 构建要写入的内容
        meta_content = front_matter + source_body

        return over_time_name, meta_content

if __name__ == "__main__":
    blog = HuxBlog(
        owner = "",
        repo = "",
        token = ""
    )

ffmpeg常用用法

2024-09-02 1 min read Tools Ronan

不改变原视频码率裁剪

废话少说,直接举栗🌰

1.从 1时15分25秒 开始裁剪到视频结束:

ffmpeg -i input.mp4 -ss 01:15:25 -c copy output.mp4

2.从 视频开始到15分5秒

ffmpeg -i input.mp4 -to 00:15:05 -c copy output.mp4

3.从 15分25秒1时15分25秒

ffmpeg -i input.mp4 -ss 15:25 -to 01:15:25 -c copy output.mp4

-i 指定输入视频路径,input.mp4是要裁剪的视频文件的路径, -ss 裁剪视频起始时间,-to 裁剪视频结束时间,-c copy 在裁剪时不改变视频编码,从而保持原始视频码率, output.mp4 为裁剪后的视频文件。

不改变原视频码率合并

ffmpeg -i "concat:input1.mp4|input2.mp4" -c copy output.mp4

其中,input1.mp4input2.mp4是要合并的两个视频文件的路径。-c copy参数告诉FFmpeg在合并时不改变视频编码,从而保持原始视频码率。最终合并后的视频文件名为output.mp4

[!WARNING] 请注意,此命令假定两个输入视频具有相同的分辨率和帧率。如果它们不同,则可能需要使用不同的参数或进行转换。

Older posts