blob: 76842afa813a416807954196857c8230de511ecf [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2022 The Pigweed Authors
#
# 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
#
# https://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.
"""Generates freertos_tsktcb.h from FreeRTOS source.
Extracts the tskTCB struct from FreeRTOS sources and writes it as a header to
the specified output path.
"""
import argparse
import re
import sys
from typing import TextIO
from pathlib import Path
_GENERATED_HEADER = """\
// This header is generated by generate_freertos_tsktcb.py, DO NOT EDIT!
#pragma once
#include "FreeRTOS.h"
#include "task.h"
"""
def _parse_args() -> argparse.Namespace:
"""Parses arguments for this script, splitting out the command to run."""
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--freertos-src-dir',
type=Path,
help='Path to the FreeRTOS source directory.')
parser.add_argument('--output',
'-o',
type=argparse.FileType('w'),
help=('Path to write generated tskTCB.h file to'))
return parser.parse_args()
def _extract_struct(tasks_src: str):
tsk_tcb_struct = re.search(
r'(typedef struct tskTaskControlBlock.*tskTCB;\n)',
tasks_src,
flags=re.DOTALL)
if tsk_tcb_struct:
return tsk_tcb_struct.group(1)
raise ValueError('Could not find tskTCB struct in tasks.c')
def _main(freertos_src_dir: Path, output: TextIO):
with open(freertos_src_dir / 'tasks.c', 'r') as tasks_c:
output.write(_GENERATED_HEADER)
output.write(_extract_struct(tasks_c.read()))
if __name__ == '__main__':
sys.exit(_main(**vars(_parse_args())))