基于python生成taskc语言文件--时间片轮询

目录

前言

utf-8

[chinese GB2312](#chinese GB2312)

[utf-8 排除task.c](#utf-8 排除task.c)

[chinese GB2312 排除task.c](#chinese GB2312 排除task.c)

运行结果


前言

建议是把能正常工作的单个功能函数放到一起(就和放while函数里的程序一样),程序会按顺序自动配置。

不同的格式已经对应给出。

utf-8

python 复制代码
import os
import re

def extract_functions():
    func_re = re.compile(r'^void\s+(?!.*Init\b)(\w+)\s*\(void\)\s*{', re.MULTILINE)
    functions = []
    
    for file in os.listdir('.'):
        if file.endswith('.c'):
            try:
                with open(file, 'r', encoding='utf-8') as f:
                    matches = func_re.finditer(f.read())
                    functions.extend(m.group(1) for m in matches)
            except UnicodeDecodeError:
                print(f"警告: {file} 非UTF-8编码已跳过")
    return sorted(set(functions))

def generate_files(func_list):
    # 生成task.h
    with open('task.h', 'w', encoding='utf-8') as f:
        f.write(f"""#ifndef TASK_H
#define TASK_H

#include <stdint.h>

typedef struct {{
    void (*task)(void);
    uint32_t interval;
    uint32_t counter;
}} Task;

#define TASK_COUNT {len(func_list)}
extern Task tasks[TASK_COUNT];

void tasks_init(void);
void scheduler(void);

#endif
""")

    # 生成task.c
    with open('task.c', 'w', encoding='utf-8') as f:
        f.write("""#include "task.h"

Task tasks[TASK_COUNT];

void tasks_init(void) {
""")
        for i, func in enumerate(func_list):
            f.write(f'    tasks[{i}] = (Task){{{func}, {10*(i+1)}, 0}};\n')
        f.write("""}

void scheduler(void) {
    for(uint8_t i=0; i<TASK_COUNT; i++){
        if(++tasks[i].counter >= tasks[i].interval){
            tasks[i].task();
            tasks[i].counter = 0;
        }
    }
}
""")

if __name__ == "__main__":
    funcs = extract_functions()
    generate_files(funcs)
    print(f"生成成功: 共配置{len(funcs)}个任务")

chinese GB2312

python 复制代码
import os
import re

def extract_gb2312_functions():
    pattern = re.compile(
        r'^void\s+(?!.*Init\b)(\w+)\s*\(void\)\s*{',
        re.MULTILINE
    )
    functions = []
    
    for file in os.listdir('.'):
        if file.endswith('.c'):
            try:
                with open(file, 'r', encoding='gb2312') as f:
                    functions += [m.group(1) for m in pattern.finditer(f.read())]
            except UnicodeDecodeError:
                print(f"解码失败: {file} 非GB2312编码")
    return sorted(set(functions))

def generate_gb_tasks(func_list):
    with open('task.h', 'w', encoding='gb2312') as f:
        f.write(
            "#ifndef TASK_H\n"
            "#define TASK_H\n\n"
            "typedef struct {\n"
            "    void (*run)(void);\n"
            "    unsigned int interval;\n"
            "    unsigned int counter;\n"
            "} Task;\n\n"
            f"#define TOTAL_TASKS {len(func_list)}\n"
            "extern Task tasks[TOTAL_TASKS];\n"
            "void init_tasks(void);\n"
            "#endif\n"
        )
    
    with open('task.c', 'w', encoding='gb2312') as f:
        f.write('#include "task.h"\n\nTask tasks[TOTAL_TASKS];\n\n')
        f.write('void init_tasks(void) {\n')
        for idx, func in enumerate(func_list):
            f.write(f'    tasks[{idx}] = (Task){{{func}, {10*(idx+1)}, 0}};\n')
        f.write(
            '}\n\n'
            'void tick_scheduler(void) {\n'
            '    for(int i=0; i<TOTAL_TASKS; i++) {\n'
            '        if(++tasks[i].counter >= tasks[i].interval) {\n'
            '            tasks[i].run();\n'
            '            tasks[i].counter = 0;\n'
            '        }\n'
            '    }\n'
            '}\n'
        )

if __name__ == "__main__":
    valid_funcs = extract_gb2312_functions()
    generate_gb_tasks(valid_funcs)
    print(f"生成完成: {len(valid_funcs)}个任务")

把项目放到python目录下,再在想要生成的位置创建.py文件

测试验证GB2312的,执行基本没啥大问题,生成的tsak文件仍需要验证,暂时没有时间。

utf-8 排除task.c

python 复制代码
import os
import re

def extract_functions():
    exclude_files = {'task.c'}
    pattern = re.compile(r'^void\s+(?!.*Init\b)(\w+)\s*\(void\)\s*{', re.MULTILINE)
    funcs = []

    for file in os.listdir('.'):
        if file.endswith('.c') and file not in exclude_files:
            with open(file, 'r', encoding='utf-8') as f:
                matches = pattern.finditer(f.read())
                funcs.extend(m.group(1) for m in matches)
    return sorted(set(funcs))

def generate_task_files(func_list):
    with open('task.h', 'w', encoding='utf-8') as h:
        h.write(f'''#ifndef TASK_H
#define TASK_H

typedef struct {{
    void (*execute)(void);
    unsigned int interval;
    unsigned int counter;
}} Task;

extern Task tasks[{len(func_list)}];
void init_scheduler(void);
void run_scheduler(void);
#endif''')

    with open('task.c', 'w', encoding='utf-8') as c:
        c.write('#include "task.h"\n\nTask tasks[%d];\n\n' % len(func_list))
        c.write('void init_scheduler() {\n')
        for idx, name in enumerate(func_list):
            c.write(f'    tasks[{idx}] = (Task){{{name}, {50*(idx+1)}, 0}};\n')
        c.write('}\n\nvoid run_scheduler() {\n'
                '    for(int i=0; i<%d; i++) {\n' % len(func_list) +
                '        if(++tasks[i].counter >= tasks[i].interval) {\n'
                '            tasks[i].execute();\n'
                '            tasks[i].counter = 0;\n'
                '        }\n    }\n}')

if __name__ == '__main__':
    functions = extract_functions()
    generate_task_files(functions)

chinese GB2312 排除task.c

python 复制代码
import os
import re

def extract_funcs():
    exclude_files = {'task.c'}
    pattern = re.compile(r'^void\s+(?!.*Init\b)(\w+)\s*\(void\)\s*{', re.MULTILINE)
    funcs = []

    for f in os.listdir('.'):
        if f.endswith('.c') and f not in exclude_files:
            try:
                with open(f, 'r', encoding='gb2312') as file:
                    content = file.read()
                    funcs += [m.group(1) for m in pattern.finditer(content)]
            except UnicodeDecodeError:
                print(f"跳过非GB2312文件: {f}")
    return sorted(set(funcs))

def build_task_files(func_list):
    # 生成头文件
    with open('task.h', 'w', encoding='gb2312') as h:
        h.write(f'''#ifndef _TASK_H
#define _TASK_H

typedef struct {{
    void (*exec)(void);
    unsigned int cycle;
    unsigned int tick;
}} Task;

#define TASK_NUM {len(func_list)}
extern Task task_table[TASK_NUM];

void task_init(void);
void task_scheduler(void);
#endif''')

    # 生成源文件
    with open('task.c', 'w', encoding='gb2312') as c:
        c.write('''#include "task.h"\n\nTask task_table[TASK_NUM];\n\n''')
        c.write('void task_init(void) {\n')
        for i, name in enumerate(func_list):
            c.write(f'    task_table[{i}] = (Task){{{name}, {20*(i+1)}, 0}};\n')
        c.write('}\n\nvoid task_scheduler(void) {\n'
                '    for(unsigned char i=0; i<TASK_NUM; i++) {\n'
                '        if(task_table[i].tick++ >= task_table[i].cycle) {\n'
                '            task_table[i].exec();\n'
                '            task_table[i].tick = 0;\n'
                '        }\n'
                '    }\n}')

if __name__ == '__main__':
    valid_func = extract_funcs()
    build_task_files(valid_func)
    print(f"生成完成: {len(valid_func)}个任务")

运行结果

相关推荐
LingRannn41 分钟前
【最新Python包管理工具UV的介绍和安装】
开发语言·python·uv
yuanjun04161 小时前
RTDETRv2 pytorch训练
人工智能·pytorch·python
杰克逊的日记1 小时前
什么是PyTorch
人工智能·pytorch·python
Sheep Shaun2 小时前
C++类与对象—下:夯实面向对象编程的阶梯
c语言·开发语言·数据结构·c++·算法
AIGC魔法师3 小时前
轮播图导航组件 | 纯血鸿蒙组件库AUI
开发语言·harmonyos·openharmony·鸿蒙开发·纯血鸿蒙·arkui / ets·鸿蒙组件库aui
后藤十八里3 小时前
Python格式化字符串的四种方法
开发语言·python·学习
Little_Yuu4 小时前
抽奖系统(基于Tkinter)
开发语言·python
豌豆花下猫4 小时前
uv全功能更新:统一管理Python项目、工具、脚本和环境的终极解决方案
后端·python·ai
消失的dk4 小时前
Softmax回归与单层感知机对比
python·深度学习