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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' }, R& Z- |  C: d; R5 _
4 @4 l' s) A, ^9 f$ y) L, |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: `% E! t9 e/ b& Q
#include <unistd.h>
$ Q7 g- V1 @3 ]# c5 |( a) A! b#include <sys/mman.h>+ P4 E# q5 w# |0 K# Q6 F4 M: ]! G8 L
#include <sys/types.h>
6 A! }! A" w  n% d) E$ E#include <fcntl.h>& M/ |8 T+ M1 V6 F( W

& v9 @9 n2 o/ g: y1 s& V#define SHAER_RAM_BASE_ADDR    (0x80000000)     z: `: e6 p4 }
9 Z: l* z4 g9 h4 _+ F" S4 n& r
typedef struct
5 f9 i! A  G0 D% J. U' d; o{9 S. @' J+ P/ n( T& t. [! x
        unsigned int a;6 ~* e0 R+ y8 X" K( j: {
        unsigned int b;
3 H* R# @9 ]- ?+ l9 O        unsigned int packet_cout;& ^' N' c, s8 u& \! E& p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 l7 O+ m* v6 G, Y1 j/ N

  X; t- I+ C  ?. G' |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! U# T7 y. J3 j( [" gunsigned int count_copy = 0;$ i/ |; `+ Y" E2 X( f5 Q: ~0 K$ L9 ?9 G
! I9 q9 ^. d' N' T
9 ?- W( n, q& B; c, h( d1 j: L! f
int main(). ]2 u5 M7 M3 \8 l: M: a) V7 A
{1 _( l2 v( K# @4 W! C$ X
        pRX_MSG_PROTOCOL pshreRAM = NULL;# T7 C( Q$ l; M! t: L( p# Y
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 J* A: Q/ A; U: G( A" @! |! `

! k$ a" s, }6 J/ r. ?1 E8 y* v        while(1)
1 q: e' c/ |* k. X  i        {
9 t5 e% W! @" R# z0 o                read_MSG_buffer(pshreRAM);4 X! P$ H' w/ ?
        }                ( q" ]9 \* R) z: T$ p0 v7 s
}9 e1 H0 C0 F/ u
& w5 r1 T' E, o( F# B0 h9 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* ^% d7 C7 F$ t' p{
1 ~8 O5 J" b& {9 H/ E        RX_MSG_PROTOCOL buf;
1 H$ W5 h: ^" ~+ L) l; I  S9 U        
. {5 G( O, H% p* ]% H% Z        buf.a = pshreRAM->a;4 v  I% D( Z' i+ r% w3 L! D4 d
        buf.b = pshreRAM->b;9 m" g5 t* l6 k, C& V# s" s* m  c
        buf.packet_cout = pshreRAM->packet_cout;
9 `4 A+ ?) `9 K; v3 w        
; H2 b5 |" B/ s& N* F        if(buf.packet_cout != count_copy)  U6 P8 i& Y4 n& T/ n2 G
        {* |* j0 t2 H0 E3 o
                printf("a is %d\n", buf.a);1 M* b5 B* m% U& d9 \( U
                printf("b is %d\n", buf.b);
# ?3 ?0 G& G+ q: x1 @$ @                printf("count is %d\n", buf.packet_cout);
" ~. m  Z. G' Y( G  ?% p                count_copy = buf.packet_cout;
5 @  X0 T- x7 w        }
5 h& M) K2 @% }3 S2 l8 F        else
# M* m4 N& @% D        {
* `+ {; A. h4 z! i9 l7 ]7 N3 G% Z! n                printf("No effective message!");
4 g1 f( V0 N2 Z% _! E, F        }
3 |( ^# C3 v2 B9 t; G: Y# V7 f( O}3 d( f1 @5 [3 d" k5 j% _7 D5 ?

3 c3 z5 w4 g6 O. V  U
* I" J2 w1 S& b5 }4 ~9 `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! I+ z- B+ X0 K& u( Q. Z3 Q使用下面代码,对内存使用了mmap函数后:
! C9 h6 q" c6 ]1 }. @& G#include <stdio.h>
+ |" P$ m' x# v#include <unistd.h>$ {5 ]+ g; e9 m5 d" S7 `
#include <sys/mman.h>( M9 [$ V4 B+ I+ j. Q+ ?
#include <sys/types.h>1 S3 q2 r; s! J0 B$ F5 X3 J" K/ w9 k
#include <fcntl.h>! g* |) y  G5 Q+ k1 |7 X
2 i7 B; O& ]! ~/ o; v2 `
#define SHAER_RAM_BASE_ADDR    (0x80000000)0 y7 T3 k( n4 p4 A  Y, _& a
#define SHAER_RAM_SIZE         (0x20000)   7 ]/ g" S" q* Z

3 D3 _3 w7 G) X5 b( Utypedef struct' H; |. ^: D2 {  b5 P
{
1 _# E  K( [. H: V5 |9 m" ~        unsigned int a;
8 v- _1 s0 c  ?: Q' ]        unsigned int b;
3 x1 m8 m9 e  p; L        unsigned int packet_cout;5 [/ f0 a  v9 `# ]+ r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 k" J8 b6 S) l, c
/ o) I+ s+ R& h. Jvoid read_MSG_buffer(int *baseaddr);: _; G4 T1 s  c/ X5 Y/ h7 V$ k" d
unsigned int count_copy = 0;7 g' }  ^3 s: c9 }7 w# N; s+ b
; S! _" `' ^$ l6 f* e
int main()( ^# N: ?. [7 F
{1 J3 z$ m3 _; W* I8 |% b: C" y1 a; o
        int fd;
" @* V3 |; n% E! p% t: \3 n7 n        int *mem = NULL;2 ^6 d) u0 j/ ]+ K; d6 \: }
% L/ A& R: |0 ?+ s; \
        if((fd = open("/dev/mem", O_RDWR)) <0)
, H) @. g  r/ i        {
7 M  |0 a+ H8 I" v6 [3 f                perror("open error");  w) A4 j& L6 R
                return -1;) t! t8 d7 s) U
        }
# O8 `* T( A5 T/ r: H, O" h        9 ~4 \! ^! u" _0 L+ M# b9 |3 V
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! m0 H: R6 h3 B* ~
/ E: o$ N" Y* k8 H' c
        while(1)8 p& a7 D& A* m9 P8 W/ E
        {8 ]& l  s2 `4 D) b2 h
                read_MSG_buffer(mem);& V. K3 @, I  j! G  z
        }                : T% O- T0 z& r+ ]2 V
}9 v6 W  M# Z- L, D' g

$ ]9 _$ z3 B  {: {- Y0 Nvoid read_MSG_buffer(int *baseaddr). J0 x& z! `% i8 ^8 z' `$ J( }
{
) z; V8 D2 G( s6 S5 [8 o- K# C: o        pRX_MSG_PROTOCOL pshreRAM = NULL;$ Q) c% @+ o. J- i) r" E! e% X6 \; K) Y

# q8 f. g7 t! w! _0 X. B7 z2 C        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 f, C% n$ B/ @& Q
) B8 O0 n  q! k! ]9 H+ ?* U/ p& m6 n& ?/ S        if(pshreRAM->packet_cout != count_copy)& Z1 v2 {2 d+ f! r; `* S% Q& h
        {
' S, Q+ M1 q" N' k/ t                printf("a is %d\n", pshreRAM->a);1 Q+ I! {- n7 J/ _+ S% d
                printf("b is %d\n", pshreRAM->b);1 L+ i; V$ j) I% M1 H; O5 T) Z. z
                printf("count is %d\n", pshreRAM->packet_cout);
7 l  ~" g) U5 T! A% C                count_copy = pshreRAM->packet_cout;
% K% b  z1 s6 ^' ~/ s- \9 D        }3 L" m: I) v4 a- A8 b0 j' P
        else+ S' v0 @* y6 a( e8 o& T, ]
        {, I7 A* L6 F4 u. v0 C* N/ q7 t
                printf("No effective message!\n");
& ?6 G( B* N) q4 V$ K4 F        }
9 i) Y2 v+ ~1 y* h! o2 {+ v}# Q, X8 X) s  J0 |8 J  k/ B
& [3 D! s* j" a9 S- r5 G8 k* f; @* E' T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 a1 N; T6 u! v
. n1 q+ }! N& j% Z. W/ ]- K8 I+ J
+ V* d1 O/ O9 P  f+ g! a

+ V" M7 X  M6 c: k, B( x/ W; G. r) a9 f9 `; h; o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 12:27 , Processed in 0.040760 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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