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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - l7 d0 m2 n2 M) v

7 w6 n3 x' }. r- f6 QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% G  W5 R" i- `* V7 w#include <unistd.h>
0 }: X. H* F# l  V+ ^) s#include <sys/mman.h>
3 \6 ?3 q  ?+ Q1 a0 h  O#include <sys/types.h>
: ?8 l- t; Z, A6 X  \#include <fcntl.h>
7 v* i. M$ Q, @/ |2 o/ U' S$ {# w: v
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 `# ~" H" Z1 d" O4 @6 \  J/ p0 M  D: X' w7 U
typedef struct
9 Y* O- z2 H8 k6 {2 J5 |2 B8 T: e{% M: \# A$ c3 i, X
        unsigned int a;
* U, E2 [8 Y# p  B1 ^: j        unsigned int b;
$ m0 z1 N4 s1 ]  S" m        unsigned int packet_cout;0 Y8 ~7 m" q, q6 e4 ~0 H# w3 P' I- w5 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& b9 K- @- J9 W; i% e  o

: V3 Z/ L4 r5 u8 G; Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ J. h7 c4 Q3 ~% z0 @+ d8 a  N
unsigned int count_copy = 0;& M8 x3 C' O3 O& a# C: @# j
0 D. N8 {: G3 x# k7 P1 D7 n
( Q3 @! I$ B. L$ m& n! i- ?
int main()
  F$ k6 r* u, c1 O{
7 R, W0 {, d2 m8 d        pRX_MSG_PROTOCOL pshreRAM = NULL;+ w% W# \! N( M1 R* H& ?( }/ U4 F
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 i' e( E0 h. E! c7 N, R( d+ Z; n" J
        while(1)
+ P5 y* \# U6 D" L- o        {3 H9 Z# Y0 B, T/ n" ?
                read_MSG_buffer(pshreRAM);% w0 Y6 I6 Z5 d1 F, H! [
        }                ! ^7 ~7 _0 }3 t/ d( P
}
" k: M5 ?, b0 o/ w6 R# b3 h8 N, q5 F2 s7 @9 X! h0 V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ W0 H3 P: S4 M3 @# @0 f{
7 V2 v& g* s% H        RX_MSG_PROTOCOL buf;! w9 q% ]( b( X. \5 e
        
: Z9 Q5 g8 J* ?0 ]' H        buf.a = pshreRAM->a;# n# W$ U3 S. \7 w
        buf.b = pshreRAM->b;
/ B' |5 j2 X2 B" c, s: ~& Q* U  X        buf.packet_cout = pshreRAM->packet_cout;+ a/ R4 D  t9 U+ T
        
2 J" }# S& U9 f% h5 a        if(buf.packet_cout != count_copy), W$ n; I7 k* J* Y4 f
        {& j- l1 O( Z" S3 f: O7 g7 m* o. o7 m
                printf("a is %d\n", buf.a);# b( L) P% w. i4 h! ^
                printf("b is %d\n", buf.b);) `6 b, ]1 k. X
                printf("count is %d\n", buf.packet_cout);
* y$ C) A* R1 m7 n                count_copy = buf.packet_cout;
0 j7 W7 P; w' A# p5 L5 `, Y$ E        }# q' R" T" Q9 x, \3 K
        else
8 O- b5 {5 ~0 s  v. S$ q  Q        {
9 g! [- E+ a# O$ V                printf("No effective message!");
% D0 L" t8 p2 O3 S, T$ K; R" O5 }        }, s9 z2 J( E* j  s% u
}
# D, }0 r3 Z/ C( p  q; S) Y( K/ Z1 j$ X
, n' |" o1 ~0 Y3 j: h& W1 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! c$ v0 ]# B) b0 y, e使用下面代码,对内存使用了mmap函数后:
# V+ n% w8 D, Y7 K5 c#include <stdio.h>
6 ~4 d4 g' F. B8 G#include <unistd.h>$ X0 d$ N( e0 w: N: E
#include <sys/mman.h>
; Z: I4 k: ~! o& N#include <sys/types.h>* |$ `- L6 E0 ~3 j
#include <fcntl.h>! _( J, u9 {, x1 F/ C2 s
$ C+ d9 P# C8 O8 j
#define SHAER_RAM_BASE_ADDR    (0x80000000)
  H2 U1 T+ a$ a) l" {; K#define SHAER_RAM_SIZE         (0x20000)   
/ X  E# W2 J/ w' J0 }5 K
" ]* T! f# b/ b9 }; utypedef struct+ U7 _4 D; {7 g, h
{+ |9 G- q+ K- G  i4 {
        unsigned int a;
5 L$ ?& }; P) s3 p" X2 D' x' ]        unsigned int b;
1 g6 K: W2 G, A* D* m% R7 R" f        unsigned int packet_cout;
- U! Z5 d- M, l) y, Y: ?. [# g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% h& I  k- [7 w2 c1 H

5 y& J6 I9 {3 {* \- hvoid read_MSG_buffer(int *baseaddr);" S6 f/ b- j( R5 y* R" o$ G
unsigned int count_copy = 0;# v2 A- T8 C; x$ ~/ a/ `/ B
% W) q. I# m1 H: h
int main()
$ D' Y: ]* c( R+ z5 F5 D! c- |" O{& u# }* ?1 m. y
        int fd;! M6 [6 o# v. N
        int *mem = NULL;7 C$ }( o3 w0 `  z

% b0 H& n8 j' P; e1 k; _        if((fd = open("/dev/mem", O_RDWR)) <0)9 E7 r! T! J: E1 k4 Z) y
        {; n7 `' y+ Q8 r4 x8 E, O3 a
                perror("open error");
1 Z6 {4 r% J0 [" Q. P1 Y: q                return -1;  C7 A' q3 p% \! P$ f3 R
        }$ G& l3 @' _8 y3 G
        
( e# k* `) p7 J. `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& J( V) L$ p. L
' V$ P0 \( C* Z) @; Z( R1 n; g        while(1)
* m& T$ X2 N6 S! v4 z8 n        {
5 N9 t# X, @9 v  F                read_MSG_buffer(mem);  X4 H; {: m3 [4 ]  g1 F3 @7 V
        }               
& T9 }, W$ N1 w}; e% A, k) e/ V- o
0 D/ V, a& z/ b8 _& Z8 y" k! d9 r8 G
void read_MSG_buffer(int *baseaddr)' v* B" z2 M' L/ R1 f
{" L  P! ?" o' a3 Q& l( J) n0 |$ E
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' y" ~4 p* V) H/ I  b3 h) B! }4 o3 ^7 \7 s/ h: ]  a" r& c9 ?% ~
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* E6 y$ D- @3 A& ^
7 w0 \) O" z2 b' v* N
        if(pshreRAM->packet_cout != count_copy)+ f+ Z9 ]5 V( e. ^& g
        {
, B. @% V: t# A2 A( Q- E& j                printf("a is %d\n", pshreRAM->a);' ?- t" B, Q+ j& G0 d  c. I
                printf("b is %d\n", pshreRAM->b);. V8 Y3 A: n! Y4 [+ P2 C
                printf("count is %d\n", pshreRAM->packet_cout);
. r1 n. U# G1 N9 M                count_copy = pshreRAM->packet_cout;
# U/ E! v, Y0 ~& M; E5 O% z8 n5 q        }% v! b5 v# k4 z, Y; M7 B
        else
) W0 u9 _& p2 _        {
* }1 `: {3 E4 _4 c                printf("No effective message!\n");
/ H+ e/ u7 o* V  |( T        }/ \: [2 x# F( s4 X8 Q7 M  ?
}
* a4 r/ t# \2 P& d. i/ Y
1 x# a! _& l, j  b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ E9 {: m9 E# x, p( F& J, c4 ~0 ~  e8 F+ f# V  `
6 R* o! d1 z: K1 e, g' o+ G8 e+ t% w

, D5 q( ~7 _! R, J- q9 S# ~4 D8 u
: l, A" r% ?4 {% D$ }# K) T3 q* V# B% ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-28 13:29 , Processed in 0.039500 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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