最近有机会使用stm8s105c6t6做开发,好久没用八位单片机做东西了,网上搜了一下stm8的相关文档发现居然有它专属的os,马上下载了一个atomthreads1.3试用,iar打开编译就出了问题:
Error[Lc036]: no block or place matches the pattern "ro code section .text in atomport-asm-iar.o"
找过去发现是SECTION .text:code定义的问题,但是汇编定义分段用的,具体功能我也不清楚。。。。 所以我猜要修改还得查stm8的汇编指令,就一个这么小的代码找那么不值得浪费时间,所以下载了其它atomthreads编译发现有能够编译通过的,对比发现了与atomthreads1.3的不同点就在SECTION 定义,在atomthreads1.3中修改
---SECTION .text:code
+++SECTION .near_func.text:code
编译成功
但发现iar编译成功后居然不在软件中显示ram、rom的使用量
查看ports/stm8/debug目录下面的log和map文件才能看到,map里面对每个c文件占用的ram和rom都有说明。。。。。
烧录到stm8中,串口和gpiod0均会有输出并会输出semaphore的测试信息,没有错误信息标示atomthreads正常运行起来了!
一、添加中断(有两处需要修改)
1、在ports/stm8/stm8_interrupt_vector.c中
struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext}, /* reset */
{0x82, NonHandledInterrupt}, /* trap */
{0x82, NonHandledInterrupt}, /* irq0 */
{0x82, (interrupt_handler_t)AWU_IRQHandler}, /* irq1 */
{0x82, NonHandledInterrupt}, /* irq2 */
{0x82, NonHandledInterrupt}, /* irq3 */
{0x82, NonHandledInterrupt}, /* irq4 */
{0x82, NonHandledInterrupt}, /* irq5 */
{0x82, NonHandledInterrupt}, /* irq6 */
{0x82, (interrupt_handler_t)EXTI_PORTE_IRQHandler}, /* irq7 */
{0x82, NonHandledInterrupt}, /* irq8 */
{0x82, NonHandledInterrupt}, /* irq9 */
{0x82, NonHandledInterrupt}, /* irq10 */
{0x82, (interrupt_handler_t)TIM1_SystemTickISR}, /* irq11 */
{0x82, NonHandledInterrupt}, /* irq12 */
{0x82, NonHandledInterrupt}, /* irq13 */
{0x82, NonHandledInterrupt}, /* irq14 */
{0x82, (interrupt_handler_t)TIM3_UPD_OVF_BRK_IRQHandler}, /* irq15 */
{0x82, (interrupt_handler_t)TIM3_CAP_COM_IRQHandler}, /* irq16 */
{0x82, NonHandledInterrupt}, /* irq17 */
{0x82, NonHandledInterrupt}, /* irq18 */
{0x82, NonHandledInterrupt}, /* irq19 */
{0x82, NonHandledInterrupt}, /* irq20 */
{0x82, NonHandledInterrupt}, /* irq21 */
{0x82, (interrupt_handler_t)ADC1_IRQHandler}, /* irq22 */
{0x82, NonHandledInterrupt}, /* irq23 */
{0x82, NonHandledInterrupt}, /* irq24 */
{0x82, NonHandledInterrupt}, /* irq25 */
{0x82, NonHandledInterrupt}, /* irq26 */
{0x82, NonHandledInterrupt}, /* irq27 */
{0x82, NonHandledInterrupt}, /* irq28 */
{0x82, NonHandledInterrupt}, /* irq29 */
};
2、
#if defined(__IAR_SYSTEMS_ICC__)
#pragma vector = 3 //datasheet中的中断号+2
#endif
INTERRUPT void AWU_IRQHandler (void)
#if defined(__RCSTM8__)
interrupt 1 //datasheet中的中断号
#endif
{
/* Clear AWU peripheral pending bit */
AWU_GetFlagStatus();
}
二、驱动修改
atomthreads中的驱动很少,只有clk、gpio、itc、tim1和uart2的驱动,实在无法完成工作。我就将需要的驱动从stm8固件库拷贝过来加入工程,需要修改一下头文件,不过很简单这里就不细说了
三、总结
最后我使用了两个线程,一个运行fft,一个现实数码管,fft速度慢的可以20多毫秒才能完成一次32点的计算,其中还把sin、cos采用查表方法处理了。。。。