OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5819|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 U8 ?7 j0 s2 s6 E7 b

6 Y  I0 m$ d5 TOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( ]: K' K* A9 T2 D6 W% q
#include <unistd.h>8 a' D( C3 u' H9 [- ?. {8 W
#include <sys/mman.h>
  T1 k4 O/ V7 v0 F& _0 W$ t1 X#include <sys/types.h>6 _: v) a: b- p, A. z
#include <fcntl.h>
  j9 B& f! a% ^2 y/ v; {5 t1 ?
1 L4 k9 K& C7 Q& k! r#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! ^/ N7 ^, j( j; s8 C
5 s+ a1 D6 W* F1 v0 ?- k
typedef struct2 s6 D5 s4 |- a
{
* j+ q; t4 W1 j$ K! T, c$ J        unsigned int a;
0 f) d1 S& h- N: E' G1 a5 p. L        unsigned int b;% P& i! _# }. [* R: J$ K
        unsigned int packet_cout;) c6 z" l/ u% w# B" c- k& Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# i! R/ `& R# L

" W' O- M0 D5 \  k/ Qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# f; k6 h. U8 U$ ?! j  D4 S
unsigned int count_copy = 0;7 ]8 B/ G4 B: E" f

# e% m. n  Z1 f+ P: O% K! e. E+ x9 L9 ~. p8 O7 {# G
int main()
" j! q9 D# T6 |{
' ?6 U0 K1 |( Q        pRX_MSG_PROTOCOL pshreRAM = NULL;" |2 X  m6 U( X: P
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  @. I0 k" I/ s+ A4 \! y8 }" E- N: a
        while(1); |. j( V! z' a$ ]! I! l1 g- @* ^
        {" B2 e, C! `' w  W1 q, r
                read_MSG_buffer(pshreRAM);
$ k$ e( ^9 E$ [2 c; t! N" q; K        }               
* o# Q; H8 _) t}
7 J2 N: R. Z1 w. C6 I) g
- _1 L" p5 m' U7 c3 evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ p! k1 |' Q! G% [- Y7 y{) o& H6 ^- b+ z
        RX_MSG_PROTOCOL buf;& X- i! B, U# Z. g
        + P9 w! s  a9 p, j
        buf.a = pshreRAM->a;
; ]" C! e: D; Y2 z5 q+ z        buf.b = pshreRAM->b;" u5 f, P) P% m$ ]
        buf.packet_cout = pshreRAM->packet_cout;' P7 l# F' V2 r- W
        0 U7 F" S0 Q  X- q
        if(buf.packet_cout != count_copy)
" x% S+ t; l! ]        {: W4 P! Z) m8 i- q& ~
                printf("a is %d\n", buf.a);
) @. t; _' L0 d6 i# x( c9 X5 c                printf("b is %d\n", buf.b);0 D. C. `- [; f( p0 `
                printf("count is %d\n", buf.packet_cout);
% J* d. U$ Y# r, }                count_copy = buf.packet_cout;
1 }# m2 a# i! i$ o+ L  w8 c- n        }. T' W* A" Q, q
        else
# R9 n9 W( o' }' q        {
; A& x6 a6 H2 I9 W1 m; h8 i) V                printf("No effective message!");
  d  B; V; E- z/ S- C        }: G3 u9 r6 n, ^6 `8 I' M" }
}
: ^& m- X3 x& ~- D7 D; d9 |, G1 W+ _! {$ E
0 ~1 ^# D, n, Y1 f4 |" U# Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( x) x+ T0 U. R8 Y. [' A
使用下面代码,对内存使用了mmap函数后:
7 l7 @0 O2 b9 U% J, [& D#include <stdio.h>8 n" H! e& e  I* S& F, o5 k0 g
#include <unistd.h>
; |# p2 H. x7 f#include <sys/mman.h>8 c8 S* t+ h0 B* z9 s( @8 U" `& I
#include <sys/types.h>& n$ o0 o& g% s% p
#include <fcntl.h>
: O4 T7 c8 t8 m. k; w' x7 g
9 g6 k7 u4 b( k, ~2 g8 F! A. S#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 L- G' z/ y2 f: V& O9 y  }#define SHAER_RAM_SIZE         (0x20000)   # y8 ]/ ]  M1 \; T# H% Y. l5 W

& [" \  W1 \, ~, m3 vtypedef struct* L/ h9 e; \7 x
{# h1 A* k+ H9 I' M7 v
        unsigned int a;
% U4 L" {: N! i3 Y: M* a1 y        unsigned int b;! v: k6 R* F! X' N& U* m- e
        unsigned int packet_cout;
, V7 ~- g' `! r. ?7 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 f+ W$ k3 p5 j& k5 y( H/ n, W0 l7 }+ d" h8 v+ ?8 N3 a
void read_MSG_buffer(int *baseaddr);
6 q8 W$ c& z; \# T7 ounsigned int count_copy = 0;
) f% h+ }) u! ~+ F& D
, y& z" |4 d, y' i& ?- F9 dint main()
8 q' ^. d' H1 b8 h4 ~. g3 [; o{
% a% E) I1 j4 n9 q        int fd;
% e5 m2 g$ @  J% c$ p" o        int *mem = NULL;
+ S2 U" h: b8 d5 n/ ?4 X. K6 L. y* j0 F0 Z7 L0 a5 ]) q
        if((fd = open("/dev/mem", O_RDWR)) <0)
2 r/ ~$ p7 `% u, |        {( j0 K8 {  \4 j% O4 b
                perror("open error");" f* U$ N( I0 Z9 y
                return -1;
; o, X; ~/ i# t& L/ b! Q        }
5 B* `4 R4 u% n% B/ D' N/ ?        " ^& X8 Q8 a  m. q$ ^
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 T2 o7 q! v# T2 @
/ p2 ~" B6 p9 P) F( e
        while(1)" \) H& P1 B1 j6 `6 U3 k0 G- e1 Q
        {4 d. w8 v  [( U" A
                read_MSG_buffer(mem);) j( `0 `- Y+ s& L
        }                ( y, m# j9 h0 w
}
. L% K! Z0 J* V9 G0 K1 x, u3 t/ X) ?3 O  a# z' t, h
void read_MSG_buffer(int *baseaddr)
' k1 ]; ^4 ]. ?1 z' N{
( v, {9 p% k/ _( s        pRX_MSG_PROTOCOL pshreRAM = NULL;( r0 q! M1 v) `) l( n

: n" e  T) k& T2 `6 P        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ P& c0 E$ G+ ]" Z/ n5 Z9 o( b( s9 b3 B2 H! Y2 z5 f; C
        if(pshreRAM->packet_cout != count_copy)
0 B$ j3 p+ U9 b5 a) q        {$ m7 z, D3 R7 \: j, b
                printf("a is %d\n", pshreRAM->a);) U# }# h# X* k4 S
                printf("b is %d\n", pshreRAM->b);5 g$ e0 r8 d% S; y; [, _+ F( y7 Q" p
                printf("count is %d\n", pshreRAM->packet_cout);+ _- C# n1 v: R, r' o+ H
                count_copy = pshreRAM->packet_cout;6 w' a0 v( V, x7 u4 k1 @% E- \5 u
        }
* W/ E8 H5 s! K7 p! E% o        else
3 C6 q5 ^# _6 T: l        {
( y8 V4 Q5 c( Y2 d2 v5 W" C$ h* F                printf("No effective message!\n");, t! }2 I$ V  r  q" R% s$ f
        }4 i1 x) k! f- j! R, [. Y) u2 P
}
- M6 x5 b) i6 a0 D1 o: l6 T! E! u! b# H* N8 S' T& {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 V; M5 T! I! C3 F
: `7 z4 t2 x% ^. ?& a0 G; t$ I' X) f, |, t) `1 D; \
' Q: R, m8 ?+ o% G' h) z; E$ _
+ A, n$ K: a/ R9 v5 k2 }# |8 X) k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-3-1 03:39 , Processed in 0.041045 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表