【目的】
移植tobudOS到雅特力ATF425开发板。
【硬件】
雅特力AT-START-F425 V1.0
【开发环境】
MDK5.38
【移植步聚】
1、下载tobandOS源码,https://atomgit.com/OpenAtomFoundation/TobudOS
2、使用ATF425官方库。复制一份工程中的printf工程。

3、把源码的目录复制到工程的os目录下面:

4、添加一个TOS-CONFIG的文件夹,制一个示例中的配置文件到该目录下面:
5、打开keil,新建os/arch分组,官方没有雅特力方面的资料,网上也没有相关的帖子,我查看了atf425的数据手册,他是arm-v7m\cortex-m4下面的内核,因此把他下面的库加入到arch工程分组中。把r\arch\arm\arm-v7m\cortex-m4\armcc目录下面的prot_c.c、port_s.S下面添加进去,在添加时要注意下面选所有文件,才能看到.S的文件。同时把os\arch\arm\arm-v7m\common下面所有的C文件都添加进工程分组:


6、新建kernel分组,把\kernel\core路径下所有的.c文件添加\os\kernel的工程分组中。

7、添加头文件的引用到工程中,如下图所示:

8、注释掉at32f425_int.c中的PendSV_Handler,以免跟tos的系统中重复函数。

9、atf423_init.c中加入tos_k.h,注意,有些移植的教程中是tos.h,系统升级后更改为这个文件。同时在atf425_init.c中的systick中断函数中添回心跳包:
/**
* @brief this function handles systick handler.
* @param none
* @retval none
*/
void SysTick_Handler(void)
{
if(tos_knl_is_running())
{
tos_knl_irq_enter();
tos_tick_handler();
tos_knl_irq_leave();
}
}10、编译一下,通过

如果有报错,记录钩选c99

10、编写测试代码:
k_task_t task;
k_stack_t task_stack[1024];
void test_task1(void *Parameter)
{
while(1)
{
at32_led_toggle(LED2);
tos_task_delay(1000);
}
}
void test_task2(void *Parameter)
{
while(1)
{
at32_led_toggle(LED3);
tos_task_delay(500);
}
}
/**
* @brief configure button exint
* @param none
* @retval none
*/
void button_exint_init(void)
{
exint_init_type exint_init_struct;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE);
scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOA, SCFG_PINS_SOURCE0);
exint_default_para_init(&exint_init_struct);
exint_init_struct.line_enable = TRUE;
exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
exint_init_struct.line_select = EXINT_LINE_0;
exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
exint_init(&exint_init_struct);
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(EXINT1_0_IRQn, 0, 0);
}
/**
* @brief button handler function
* @param none
* @retval none
*/
void button_isr(void)
{
/* delay 5ms */
delay_ms(5);
/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_0);
/* check input pin state */
if(SET == gpio_input_data_bit_read(USER_BUTTON_PORT, USER_BUTTON_PIN))
{
if(g_speed == SLOW)
g_speed = FAST;
else
g_speed = SLOW;
}
}
/**
* @brief exint0 interrupt handler
* @param none
* @retval none
*/
void EXINT1_0_IRQHandler(void)
{
button_isr();
}
/**
* @brief main function.
* @param none
* @retval none
*/
int main(void)
{
k_err_t err;
system_clock_config();
at32_board_init();
button_exint_init();
tos_knl_init();
err = tos_task_create(&task,
"task1",
test_task1,
NULL,
2,
task_stack,
1024,
20);
err = tos_task_create(&task,
"task2",
test_task1,
NULL,
2,
task_stack,
1024,
20);
tos_knl_start();下载到开发板后,可以看到两个灯不周期的闪。
我要赚赏金
