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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) t3 N+ n3 Q) t" d3 f2 E
' p" Q3 s. U, Z" ]3 ?" A7 \OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 M9 f+ R  p: U: B1 U- _4 Y4 P8 v
#include <unistd.h>
5 j. L) }4 ?* l, z# n5 x  g) D6 t$ N! J#include <sys/mman.h>* j, h5 F+ ?$ M- q& X1 r/ q7 n/ }
#include <sys/types.h>
2 o2 o3 k0 }" X3 c9 o! G4 I8 G#include <fcntl.h># p- K$ f7 _2 t  m9 `

: w6 y. Q( ~1 Y) J#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ u; i& d: r  S# w
( R- B8 B  [, N7 T2 g& n
typedef struct
8 s7 {$ f' [3 _7 `2 A! T. a, |{, L1 [' W6 r8 ?8 w
        unsigned int a;; R& v; ^- s6 M  b: _; N* @
        unsigned int b;' ~/ H2 a% `2 X6 f( {/ e6 M
        unsigned int packet_cout;/ F+ e2 }- q& E* ^' R" ?1 P% @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# u4 i+ |/ L. v4 B" h; G9 e+ B3 N& o$ ?, S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ W7 ?- _' N" t, P" G  A  x- I
unsigned int count_copy = 0;
2 ~5 d6 N( \/ N' n; J7 g! @! }! q$ {% I/ F( u$ {

) }0 i5 u7 z+ ]int main()
/ y8 p8 N6 |+ e+ K2 d( @{
5 m5 J. d& E- v" B+ P6 c# k, Z* z        pRX_MSG_PROTOCOL pshreRAM = NULL;
! @# K7 B- e! U        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ ?( C- i" v/ [& a# z* o
% ^- S9 X5 k$ ~/ F4 v
        while(1)
/ I9 s. c. A8 g6 O! u3 F- p        {
% `2 F1 ^# s* X* h2 I                read_MSG_buffer(pshreRAM);$ D: W$ ?5 N8 s" m. j% b2 `# J8 z
        }                ; @, ]) [; w8 j  Z7 a
}% j5 A7 ~* o+ r/ ~5 f
5 Q7 u7 u" y# R. l# }# s3 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( M$ M+ c; |% f) M3 G
{
; A0 A6 d. ~0 a$ c, |' j! j4 w: ^        RX_MSG_PROTOCOL buf;+ T! X1 N, M! L
        
2 b% u1 b* Q$ ~; d, A& \& D! L; ?+ K        buf.a = pshreRAM->a;
/ X, Q7 N8 {' z9 `# \3 r; O- q        buf.b = pshreRAM->b;
) S, i& K- z. }- t4 E1 {  ]        buf.packet_cout = pshreRAM->packet_cout;
$ h& |( M: |+ T7 Q5 v# Y* y" Q! A        
- P4 X8 V( i+ o1 \4 b6 a3 f        if(buf.packet_cout != count_copy). q, V* Y0 R( Q% w7 V* _
        {* h$ U4 l; x; }0 h- v2 L8 b4 z
                printf("a is %d\n", buf.a);
1 ^5 M8 x% c5 j9 i! Q. h                printf("b is %d\n", buf.b);
+ I& a$ ]6 Y, S& s; T& t% T                printf("count is %d\n", buf.packet_cout);
# K+ ~1 `7 n; a                count_copy = buf.packet_cout;
% _8 d# m$ h8 e: C        }; |4 Z$ u7 I$ N* R) d* a
        else1 {& J  Z- [) V
        {& C1 y( q  d- x$ o3 O6 t
                printf("No effective message!");! d( @5 h) n/ d. p
        }
% i2 J) Q( t! r' J}
$ a% X0 S2 G. p, F* |' S/ V" D8 V+ w, U* m1 @  I

, z/ ]$ `2 h" A; ]7 E8 S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! K/ B4 ~, s+ H, [  g) }
使用下面代码,对内存使用了mmap函数后:7 J- A9 S- v7 _) J! Q
#include <stdio.h>0 h- i, v# A! b2 S5 d+ p
#include <unistd.h>
* y+ i& R- d6 ?6 q#include <sys/mman.h>
2 G) O( ^: l" |% c#include <sys/types.h>. v4 R( E+ w, q
#include <fcntl.h>( D5 L% A: d' Z% ], E$ g1 ]! V
5 b0 M! r$ l# T7 W$ w% m! N& d3 Q: z3 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)# _! A# Y( |. @# n1 P0 f7 c
#define SHAER_RAM_SIZE         (0x20000)   
5 a2 q% k  i5 y" {. }( C- X% [7 l! q3 ]& d- f3 L# R. M* O
typedef struct
. m3 p. u' _7 d: T{7 W3 X  j! Q8 s: G
        unsigned int a;# d9 J1 H5 ~/ q2 {
        unsigned int b;: m: V( e' A  ?# K0 X
        unsigned int packet_cout;. L1 i. k+ l( `" d; V5 [" i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 p0 y2 S* Q+ ^$ c( H* Q. O4 j1 z0 W
" d( y, q' U" K3 b7 F8 J/ Cvoid read_MSG_buffer(int *baseaddr);
8 C' ?& g8 N7 q6 X1 m. L& Xunsigned int count_copy = 0;; [) |( B% Z5 O+ J/ D
* L/ r) W0 C3 r2 ]% u7 L
int main()
2 P9 V# m& ]  k, k1 o8 i. E{
0 ^+ R/ p% X0 C/ o* g- \. J# M        int fd;; {( I/ B  g+ F( b/ @* g
        int *mem = NULL;6 n' n8 [4 H. W) s$ H6 b6 \. G

  z& z5 d$ [- g8 f# f        if((fd = open("/dev/mem", O_RDWR)) <0)6 w7 E) V: a! V  _+ y0 z$ e
        {7 y" U7 I7 p' {5 F5 E4 h! q
                perror("open error");2 |2 C. U; ^2 P' W# g
                return -1;6 n) D+ @$ j' x5 Q( q# L$ B
        }
+ Q6 x; L# }* l. v2 E  L- G* D        
( J: ^. B- B: o' Q) x8 j0 C+ V        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ l# r: f3 U" o6 m( L
! J9 X% |  L1 B1 a( \7 n        while(1)! E6 s: F. t6 L8 ^+ m
        {
; q- X5 {9 ?8 c1 J# x0 {& r# [8 k                read_MSG_buffer(mem);$ Y2 O$ w4 l! i% l5 X# n
        }                2 J7 c# E3 B+ r& J2 I+ S
}
) i: K! e1 T2 C& B- X  w* t2 }& M& u9 s" S5 |$ M
void read_MSG_buffer(int *baseaddr)
% ?# |$ r$ Z. B, o) q1 t$ l, b{
& t4 m  S& g9 p9 w. \6 c, {        pRX_MSG_PROTOCOL pshreRAM = NULL;# U; a" b, X, u2 P% X% s

9 A; d# ]- \& y+ U7 D) {- F1 i        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; o( V+ M' }* q2 n4 j
1 G4 Y' t$ K$ M: V  z- y
        if(pshreRAM->packet_cout != count_copy)
0 ~& ~' k9 w  s% I. ], j* H2 x        {0 R7 O8 S! c5 ]1 j
                printf("a is %d\n", pshreRAM->a);1 Q2 Q1 E+ U" A2 Y1 x: i/ O: _
                printf("b is %d\n", pshreRAM->b);
- a4 a) |$ R3 A( {: A; B                printf("count is %d\n", pshreRAM->packet_cout);4 Y/ U! X. E0 z; a
                count_copy = pshreRAM->packet_cout;" p2 q- d+ Z  A# B7 e0 \# L. L
        }
* P( l6 h, a- E1 y0 A8 P: D        else
& m  {; m6 O6 @$ C2 ^# V" l- ^' b$ q        {2 h1 U; k' ]9 h
                printf("No effective message!\n");
; }4 ~+ `' J- ^        }* F% C- I8 Z  F5 C! @
}
* x  C' [- m% O0 p5 W2 p% X. D" G$ C# H2 k; W# r* P9 p: M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' |1 }& @8 `. `! z+ ^1 N2 u$ I) p; v/ ]3 m4 j
8 Q, t9 V9 a* \, h4 {( l: O

; f+ P6 ]) |) v6 z% G; t+ U4 e, X1 B8 a) g6 U! Z4 k+ J7 A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 12:40 , Processed in 0.039694 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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