OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   v' b& F8 O( e+ [' s! N( Z
8 I$ Q- v& l/ Z. H' O, }  ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- q0 p, T- `3 W; j#include <unistd.h>
2 E. y: d. s# ^+ P0 R#include <sys/mman.h>
3 ~7 I! E' A. `* L/ W#include <sys/types.h>
% p! m$ u- X7 [4 z' c#include <fcntl.h>/ y* a3 N3 A: r! v6 O; g5 D/ Z

( `+ D: O; u7 X4 K  E0 [% U#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 c6 J2 M& y$ O& g. X8 U, V: K1 \; y4 c
  z+ u. c$ m0 f3 etypedef struct) f  M: R3 q$ t( p
{! k3 m) R2 j1 S5 S* o, j8 V
        unsigned int a;
8 S2 }4 W- f" H# v) L        unsigned int b;
/ O" x+ g* Y4 `1 o5 b        unsigned int packet_cout;- U/ R/ Y- C% G) k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. O* Y( V& S/ [( v
$ _# _* n9 I) M. f6 w; d7 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& v$ ?! {' c! i' b
unsigned int count_copy = 0;
4 w8 E# E! F/ g3 ]% U* e
- T# v0 n, t9 s4 H  h2 a, g
' I# k0 S- V: _! B3 w  _1 B6 J0 Fint main()
' o& S) Q0 V4 Y$ l( w( f+ j{
4 d3 d+ q1 y; Z$ _8 Y! [2 w        pRX_MSG_PROTOCOL pshreRAM = NULL;1 o  a& l. i/ k4 ?: t/ U* V
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 S% S$ V8 O3 U8 F* e5 c
9 R/ O+ W8 X$ }+ w) Z0 H% n) K        while(1)
4 o0 z: Y" r6 d5 v0 H: V6 _0 p+ j        {
2 O0 v* f( ]# t9 O                read_MSG_buffer(pshreRAM);' f; V6 z7 h9 K0 ]# f* S0 e+ L
        }                $ _2 ~6 x2 |' M
}
& t: U$ [5 Q6 b- ?
7 W3 l: R& ?, F7 E3 Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 x8 Q! \4 p# X* P
{7 h4 h$ x0 G, h" }: Q: f
        RX_MSG_PROTOCOL buf;
1 C( o: W/ Q' J: l) |1 ~' x; |        & X# m- u+ H* q0 F$ S3 w
        buf.a = pshreRAM->a;" B- B- V- U2 \. D& [
        buf.b = pshreRAM->b;: B7 c) h. @* n! y* ^; D. I
        buf.packet_cout = pshreRAM->packet_cout;3 w2 D" d" V. [7 q" s+ R/ ]
        
4 i2 |+ [" m) ^, n8 o7 P        if(buf.packet_cout != count_copy)
) {1 D' T% x' c6 u- }* M) P( Y        {! Z) s, G- P8 V; P
                printf("a is %d\n", buf.a);' x) _& P/ d0 e" F1 u
                printf("b is %d\n", buf.b);
" `! X# F8 V3 e& G                printf("count is %d\n", buf.packet_cout);
& d5 r, R6 {6 r                count_copy = buf.packet_cout;2 K, q5 Q* w* q2 }% c
        }/ _; [0 @; y: ?6 D
        else. i0 u1 J1 W* Q: x* F
        {
& z: ~# E9 g( u4 `/ [                printf("No effective message!");
8 |  @+ O4 t# B: p        }2 [. B5 B/ _$ J( r
}# V  c  s' A5 d

1 X* Z. l1 E1 W) U
) c9 s! S9 o* @+ c; L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 F  K- W% |- M8 E2 Z
使用下面代码,对内存使用了mmap函数后:
" w" w, W* M- f/ p#include <stdio.h>/ u) |) Y; E* W6 d4 e6 v
#include <unistd.h>9 Y# W  s- E$ k
#include <sys/mman.h>  t1 ^; e1 }, _, u1 G4 h6 T
#include <sys/types.h>; F. U; r4 \# k0 M0 z* w
#include <fcntl.h>
+ `% m) n  Y* Y
. n/ e" k, p3 P/ r5 n#define SHAER_RAM_BASE_ADDR    (0x80000000)8 o, @: J# Z4 m
#define SHAER_RAM_SIZE         (0x20000)   , b( L5 {7 [+ G5 R) F* j9 U1 V8 w4 [
) i2 m! x1 }7 S/ r* t4 i
typedef struct7 L  }3 w3 b/ I3 h
{
( j* a3 c3 y; `8 V, x6 y: F& X        unsigned int a;
3 Y7 G4 @+ d9 o. d7 \        unsigned int b;
  x  y2 n, Q; S2 F! u# B        unsigned int packet_cout;
/ d% _5 |: R2 W2 Z, v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 [: j2 H. F% B0 h: u( c# F5 t4 v
6 w+ y, f9 z. uvoid read_MSG_buffer(int *baseaddr);% k: t/ a7 z+ E
unsigned int count_copy = 0;8 B/ h$ q0 L: o- u; c5 s: e
2 N9 S6 M4 X5 W
int main()3 f; R: c) |' P& F+ f9 q
{
) I( w- u) m: n' d. `! g3 C9 a        int fd;; d2 e# A' C  [( N" E+ {. @1 ?" ?% `
        int *mem = NULL;
( H9 _# o* e# O. p% T& D; k4 J4 D8 H+ E3 L" S$ g+ n6 E1 t
        if((fd = open("/dev/mem", O_RDWR)) <0)
' ~# F4 y9 ^+ |; x! [  [        {. }' T3 b6 [( a6 t
                perror("open error");
& R# H% ]6 J! n" e                return -1;0 U3 O1 S( X5 A! u/ s
        }* @! O& p7 |: P
        , B6 o0 l4 a- i1 G/ M+ j
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 u( m! }* ~3 `& ?8 m* l. Q  U& v. e+ o+ j9 @- f& Z, j
        while(1)
, {! `' ~' y% w# a1 v4 t" L        {6 M) w$ @5 ?; h* y4 y
                read_MSG_buffer(mem);
7 A, S" W( ?$ b& ]9 w1 O        }               
& I  j7 w) w1 J/ {# z. V. N}7 [6 G7 _# w' K1 ^+ p+ c2 m% @

, K/ a1 w& ~6 L8 w$ v9 fvoid read_MSG_buffer(int *baseaddr)6 O1 z' U9 y/ F; }+ j7 f( r$ r  @
{0 \" |9 ^$ K" {  v! l2 o
        pRX_MSG_PROTOCOL pshreRAM = NULL;( n* O5 C8 ]7 i

1 D6 ?1 e6 i8 s" G( C        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ ~' f& E  r. [( P5 H9 e6 w) d( g2 c  ^9 S) n. }. f
        if(pshreRAM->packet_cout != count_copy)
6 i0 B- _& r' O4 t9 Q4 E2 H, O        {: ^! |- T, N8 r: f
                printf("a is %d\n", pshreRAM->a);
' J: n' I3 Z6 R* _# n  k$ e                printf("b is %d\n", pshreRAM->b);
% V' S2 O' X' b6 U                printf("count is %d\n", pshreRAM->packet_cout);' |3 T# ~  w- C+ H8 `" c
                count_copy = pshreRAM->packet_cout;
9 ?1 Z; z! M( `+ T$ [        }
) F$ {$ {! h  G: b" Q" U        else3 a  c7 {* |# e5 y+ ~
        {
; o( V& ^3 r  H+ o9 X3 {, ~                printf("No effective message!\n");: L/ N# e: \/ P
        }6 m( C( D2 g4 y. T9 }0 t( v
}9 m$ N* l5 }% }) U7 V
1 O: H' n( C! {* q' M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. y+ p! q6 L0 g& d0 s; W( }
: P7 ?( ?, j* ^9 P4 S  F
- x# z( C# W3 j! o4 _( s
& E) ^' n9 a8 m, \; }
6 d" B7 _% N7 V4 M6 {/ h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-30 23:02 , Processed in 0.039500 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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