wirebed 快速入门

新建项目


建议用户使用wirebed开发包wirespace,复制ledblinky作为模板。 wirespace目录结构如下

wirespace

  • Common
  • ledblinky
  • Libs
  • stm32f103c8_uv4
  • Tasks
  • windows_qt4
  • bspApp.h
  • bspWire.h
  • ledblinky.wire
  • ...
  • ..

用户第一次使用,可以直接打开ledblinky程序测试。
快速入门使用ledblinky作为参考,wirespace文件夹说明

  • Common ---------- 所用项目之间共享的C/C++源文件和task组件库
  • ledblinky ----------- led 闪烁例子
  • Libs ----------------- ledblinky项目C/C++源文件和task组件库
  • stm32f103c8_uv4 - 运行在stm32f103C8 MCU BSP支持
  • Tasks ---------------- wirebed框架自动生成的C,C++和h文件
  • windows_qt4 ------ 运行windows平台BSP支持
  • bspApp.h ---------- 应用BSP接口头文件
  • bspWire.h ---------- wirebed框架BSP接口头文件

如果需要ledblinky运行在其他MCU或者平台上,需要实现bspAPP和bspWire中的接口函数
Common文件夹中的task组件*.task会加载到面板Common task。
Libs文件夹中的task组件(*.task)会加载到面板(Project task)。
运行wirebed.exe,打开wirespace文件夹中的 ledblinky.wire。 该项目中有2个task:

  • LED 控制led闪烁
  • KEY 按键输入扫描

 

wirebed视图


wirebed有三种视图模式

  • connection view

针对任务的操作,比如任务之间信号连接,添加/删除任务,任务配置等。

  • transition view

任务内部操作,比如任务的状态添加/删除,状态转换添加/删除。

  • code view

任务内部代码编辑视图,比如信号,槽,事件定义等。

 

视图之间的切换

1. connection view切换到transition view
wirebed默认的是connection view。右键点击一个任务,在弹出菜单中选择 transition view转换 到transition view。
2. transitioin view切换到connection view
在transition view 视图中双击空白处,返回到connection view
3. transition view 切换到code view
在transtion view视图中点击工具 C99,切换到code view。
或者右键点击状态,选择entry action进入状态进入函数
或者右键点击状态,选择exit action进入状态退出函数
或者右键点击状态转换,选择action进入转换处理函数
4. code view切换到transition view
点击工具 C99,切换到transition view。
 

任务之间连接:信号与槽


任务之间的连接是信号与槽的方式(signal-slot)。
信号和槽都是普通的C语言函数定义,在connection view一个连接就相当于一个信号对槽的调用。
信号的定义:普通的C函数,以sig开始,比如LED任务中的信号定义。


static void sigToggle()
{}

槽的定义:普通的C函数,以slo开始,比如KEY任务中的槽定义
 


void slotoggle()
{
....
}

新建连接
1. 在connection view中,点击工具“new connection”
2. 选择信号对应任务
3. 选择槽对应任务
4. 在弹出菜单中,选择已经匹配好的信号和槽函数。
wirebed保证只有相同函数原型的信号和槽才能连接。信号与槽函数必须用static声明,防止任务间命名冲突。如果有连接,信号函数的实现会被wirebed填充对应的槽替换。
 

编辑连接
在connection view中双击connection,可重新选择匹配的信号和槽。
任务内部: 状态,事件,软定时器,transition转换。一个任务最多256个状态(一个默认初始状态),32个事件,1个软定时器和任务启动函数。

任务启动函数

进入code view后,点击工具栏 "task init function",自动跳转到该函数


static void __wb_task_init(void)
{
...
}

任务软定时器


软定时器服务函数,进入code view后,点击工具栏 "timer service function",自动跳转到该函数
 


static void __wb_timer_service(void)
{
...
}

软定时器的API
 


void timerStart(uint32_t ms);
void timerStop();
uint32_t timerRead();

在定时服务程序中,可以调用信号,槽,重新启动定时器,或者BSP函数灯。
开始代码自动补全: 在code veiw模式下 ctrl + E开启自动补全功能。

任务状态


一个任务是一个FSM状态机,每一个时刻只存在一个状态中。
每一个任务包括一个初始状态
每一个状态包括entry action处理函数
每一个状态包括exit action处理函数

任务事件


任务内部状态转换需要事件。事件定义: 普通的C函数以evt开始。
注意事件定义函数,没有函数实现,软件会自动填充
 


static void evtKeyOn(void)
{ }

 

任务转换transition


任务内部状态之间的转换,依靠事件转换。
每一个转换都有对用的事件转换处理函数。
wirebeb状态转换只支持单一事件触发,需要多事件触发,请增加多个状态
新增transition转换:在transition view视图中点击工具“new transition”。
点击任意一个开始状态,再点击结束状态,在弹出框中选择事件即可。
开始状态和结束状态可以为同一个状态
修改事件:
右键点击transtion转换,弹出菜单中选择 “Event...”
修改转换代码:
右键点击transtion转换,弹出菜单中选择 “Action...”
 

任务导入和导出


任务可以单独保持,导入,导出。
任务导入导出后,不能保证底层BSP函数都有实现
1. 在connection view视图中,右键点击任务,弹出菜单中选择“save”,保存即可导出。
2. 把多个项目公用的*.task文件保存到wirespace\Common文件夹中,在connection view的“Common Task” 拖入即可实现导入
3. 把单个项目私有的*.task文件保存到项目对应的Libs文件夹,在connection view的“Project Task” 拖入即可实现导入。
 

wirebed 框架底层支持


支持wirebed框架,需要实现以下接口
1. 系统时钟,建议返回一个毫秒为单位的系统时钟,该时钟被任务软定时器使用。
例如STM32CUBE定义如下
 


uint32_t wire_timer()
{ 
    return(HAL_GetTick());
}

2. 临界代码保护,禁止中断调用或者RTOS线程切换。
例如STM32定义
 


void wire_enable_irq()
{ 
    __enable_irq();
} 

void wire_disable_irq()
{ 
    __disable_irq();
}


3. trace 接口函数
trace 接口是可选的,例如stm32平台中trace信息uart输入到电脑
 


void wireOuput(uint8_t * data,uint32_t length)
{ 
    HAL_UART_Transmit(&huart1,data,length,1000);
}

在windows平台中,trace信息通过UDP传输到电脑
 


void wireOuput(uint8_t * data,uint32_t length)
{ 
    socket.writeDatagram((const char *)data,length, QHostAddress::LocalHost,2332);
}

应用接口支持


根据项目需求,可以在bspApp.h中定义需要的接口。
命令规范入下;
wirebed框架代用的C函数定义格式 bsp_led_on这样格式
底层回调wirebed任务中的函数, app_key_callback 这样格式
底层回调的函数不能为static
 

wirebed 生成代码集成


框架代码导出完成框架的代码后,在connection view模式,在菜单“Setting”->"Export Code..."。导出代码到 Tasks文件夹。
wirebed软件会自动语法检测,如果有错误不会导出代码。
进入对应task的code view,点击工具“Check code”,可以检测代码错误。
在菜单“setting”->“Enable C++”生成C++文件,否则生成C文件。
 

代码集成


根据不同的编译,比如IAR,KEIL,ECLIPSE等,需要手动添加对应生成的C或者C++代码。
例如在stm32平台中主函数定义。
 


//other board init
registerTraceBsp(wireOuput);
registerTimeBsp(wire_timer);
registerEnableIrq(wire_enable_irq);
registerDisableIrq(wire_disable_irq);
taskManagerInit();
while (1)
{
taskManagerRun();
}

在RTOS或者windows平台中,可以作为一个低优先级的线程运行。


wirebed trace跟踪

1. 使能trace功能
为了减少代码尺寸,在connection view模式下菜单“setting”->“Enable trace”取消trace功能。更改设置后,需重新编译生成的C代码。

2. 开始trace功能
在connection view 中,点击工具“Uart trace”进入Uart trace功能,再次点击退出trace
在connection view 中,点击工具“UDP trace”进入UDP trace功能,再次点击退出trace

3. 变量或者信息输出
xprintf类似输于C语言printf函数,输出变量,调试信息等。
 


void xprintf(fmt, x);

4. 使能变量trace
为了提供调试效率,可以禁止不需要的任务的变量trace信息。在connection view视图中,右键点击任务, 在弹出菜单中选择“Eanbe Trace”,可以使能/禁止变量信息输出
 

猜你喜欢

转载自blog.csdn.net/qq20975717/article/details/81150268