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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " j8 ^; F4 _2 s$ E. H

& ]) j7 o. `: b! `% ^$ n5 L# OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& N& V' A* {  Q/ W  Y# Z1 X
#include <unistd.h>- g$ [* K  R+ u# v  Z, G4 T1 H
#include <sys/mman.h>. E3 \9 k6 \- d8 s
#include <sys/types.h>' D) M' k# K1 @, C
#include <fcntl.h>  r3 r3 H9 w6 ^+ _  e' u, V4 k" \

! P, p' {. S, n4 Q6 S2 }- b. S#define SHAER_RAM_BASE_ADDR    (0x80000000)   - P0 T  o6 K& Q( V4 y. P% F9 X2 [& D
+ `. l4 m7 z7 P- N2 ]+ q
typedef struct5 W# S4 |! k7 M: |" I- y
{4 k$ _% ^! g1 f" W# o' c! ~
        unsigned int a;% n4 N: W5 E: a& @* c7 `& w7 @
        unsigned int b;
& Z- X! }" q! V! w& ~        unsigned int packet_cout;" n3 w, Z# i" n# \/ v4 r2 k: r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- h* @. R0 X- ]' b) @) |: ~* M) g( m
  K( l5 C0 a  x& _. G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. d2 {" z/ D# }7 Nunsigned int count_copy = 0;+ C3 C# n) X) ]% B1 N, Q

9 R; ~  d2 @) o. d4 d7 f+ k1 J9 F2 d: u1 P: b) C: V  T& K# a4 H$ ]  p7 O
int main()
' X8 j. {6 I/ t, b{
* U  u7 a/ d. g1 j$ O        pRX_MSG_PROTOCOL pshreRAM = NULL;* G3 ~" `3 ^4 P: H3 }6 P: ?
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 J5 g( O( I; r8 K! Z( f8 ]
# \# D, ^7 W8 l5 B: t$ J
        while(1)0 Z( s1 [7 {" b2 M
        {8 n* N9 C7 o! |$ \, v7 e" ]" g
                read_MSG_buffer(pshreRAM);; u% _8 G( Q- E2 a$ A, G& \4 c
        }                ! G" F, m5 d- I. m- a7 M! y! r6 k. I1 E
}
' v9 |7 r; o! P( F
/ Z# E! H/ P6 t% Q3 b/ q0 Vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' S, S# a/ w! W% A5 }" U/ t8 ]
{7 ]- F5 h4 S9 G! a8 i  H
        RX_MSG_PROTOCOL buf;
/ U  k- i7 _5 l1 [- g# ]        
& h5 J# w& `5 X) l0 T, T        buf.a = pshreRAM->a;& ?+ i$ R: [9 Y) I4 w$ F2 D
        buf.b = pshreRAM->b;
- ~. v8 t. I" J. P. }! Z+ Y% h        buf.packet_cout = pshreRAM->packet_cout;: S2 U# J8 b' K: p0 q+ h; R
        7 N# K3 H. m! {% p. H3 z
        if(buf.packet_cout != count_copy)& J% G: P, S" M
        {
3 |. M; V- ?( x+ q6 u2 P; x2 D                printf("a is %d\n", buf.a);  {( \* ~: p5 x6 F1 n+ z
                printf("b is %d\n", buf.b);+ J5 p! U8 c( X+ I/ e
                printf("count is %d\n", buf.packet_cout);8 I( D7 U, G! q7 k; J" u# l
                count_copy = buf.packet_cout;
; T- B% ?  J5 c/ V$ E        }
5 h( p# U3 W# w* _        else# _6 O, ?4 d+ `
        {3 @( g9 K- _$ R' b+ s) ~+ _/ p
                printf("No effective message!");0 n- f& G9 ]/ _; I4 a( R1 ^
        }
3 j% j1 Q, D7 t# O6 V$ F' q}: M# c6 s5 H4 Q$ V
- L  H4 h3 F* }3 a+ C
, I8 p9 }6 A0 |9 i" r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 t& p9 o9 ]2 z' I使用下面代码,对内存使用了mmap函数后:8 b! T! z& r5 i0 ^1 l0 S
#include <stdio.h>
. e" k7 I" s- q& n& _#include <unistd.h>
$ W% c6 a$ ^% }! i  x#include <sys/mman.h>
2 G( B. n7 V# A#include <sys/types.h>
3 l  ^& j2 A6 X% Q5 T5 u#include <fcntl.h>
% ?6 h3 G4 J* A  A) Y: z. I
+ V0 I( q: E6 U, T#define SHAER_RAM_BASE_ADDR    (0x80000000)
% |- I8 U' L  J- |4 r# T#define SHAER_RAM_SIZE         (0x20000)   
2 z7 Y% q" c- i* Q4 K, c; B9 v' c% T- M8 H8 f" ^0 Y6 G3 Q
typedef struct, O9 K8 E- F' B5 w5 ?; G, b9 v" }) o
{9 H  L9 F8 i, O4 i) Z+ a$ W
        unsigned int a;
& @' |  Q. R# }        unsigned int b;/ T1 x: O1 {( e$ Z- g
        unsigned int packet_cout;. r; N( u6 @% W# s& o- p# j2 m- S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) h$ G+ e& g; m5 R& l
: A% f  w* x# x! g$ }8 t4 ~* K  [9 @void read_MSG_buffer(int *baseaddr);
/ Q$ A* a+ F" n  c/ F& bunsigned int count_copy = 0;( B/ B! T! F* c* K6 v5 I& i

; w; \0 s  _$ }# Z; `int main()2 J1 C" K5 B# j  e7 E
{7 ~0 \; a. Z0 G/ Q: D5 {* \
        int fd;
1 F5 M# l, i5 Q. B" _$ G        int *mem = NULL;
# i4 e" o3 `2 |, Q5 L, g5 J: _. [& {# _, _2 K4 z1 X' `: K
        if((fd = open("/dev/mem", O_RDWR)) <0)* h8 a  O$ n9 U+ @! Y; s2 C  _
        {
+ e7 r& M2 R6 N2 a+ `4 y4 A                perror("open error");0 v. C1 V3 s* H4 t
                return -1;5 w( l+ I' ~1 _/ i4 c  k  ?* b
        }
9 K4 B8 }* a% q) X- J$ c        6 r$ u" @- Y- @/ E. P
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 z% [+ y0 a% l/ z/ ^2 b: V; d0 b# }+ }7 `5 z, C0 a# b8 f
        while(1)9 p+ [/ d9 d( s$ }3 W
        {( x  X: i' J+ I
                read_MSG_buffer(mem);! @  E/ K- f2 b3 Q: Z+ o9 N
        }               
1 S& b5 P" [# K. m8 s' v: t}
" Y- C' E% H# A- g7 W0 h' p
2 U, v: r) y( t+ Zvoid read_MSG_buffer(int *baseaddr)- N( r3 \7 X0 H
{# k+ z2 u. @, f: ?1 G; k. C
        pRX_MSG_PROTOCOL pshreRAM = NULL;' P& U# |1 w( N1 `, {/ X

! a6 A6 A9 I& V) y% h( t- _( E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 R: U6 i/ ?' n% c  e2 E) n& f( r& j# t
        if(pshreRAM->packet_cout != count_copy)0 C9 ~1 U8 Q9 F
        {
& \0 g7 x, ^; E- T                printf("a is %d\n", pshreRAM->a);+ f. X4 J3 Q! s% N& `) H
                printf("b is %d\n", pshreRAM->b);$ O5 F! c9 F7 `. c# Y( R0 H! O
                printf("count is %d\n", pshreRAM->packet_cout);0 q7 A, D& i6 A8 {* A2 w
                count_copy = pshreRAM->packet_cout;1 G. ^: F# ^9 |7 c6 `1 X
        }. @) M9 z* [" f4 ~
        else
, ^' Q/ Q# C- k* _6 t( O' ]  D        {* k/ [( q. E/ P9 u, q/ B
                printf("No effective message!\n");  P( b6 n+ c* E2 ^* I
        }
2 g  H" _: l; G* S" S1 A}: @! ]* s# u; P* w- d3 S7 N

; I8 M& G5 D* u7 h$ n( [  q! U% Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* X% g) b0 `/ V$ S3 Q, L. V: h

( I8 m( S7 b1 E, O) \+ j6 P
6 x1 g* k. A& N5 _7 r1 B: n6 q/ z
/ N" F& _4 H; i, V& r- y* {4 S& E) w, l5 [5 }# O& A$ u2 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-29 05:26 , Processed in 0.045240 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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