目录
[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)}个任务")
运行结果
