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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + f2 |/ u5 k; Z! \" t1 e1 F# H$ v

6 V5 j8 r9 W5 |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ S# M' }9 {0 U5 @2 L
#include <unistd.h>
8 ^7 j0 D0 v( |& v3 I#include <sys/mman.h>
* \$ r( N/ b- }$ m5 g5 y- F/ e6 ]" w#include <sys/types.h>% _% }- C+ L4 Q! J3 f9 M7 h
#include <fcntl.h>  n/ i: K1 b9 s, d$ L' ]
7 ^6 g1 ]6 c. j2 A7 k6 z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   + k' A' X* `; Z
5 z3 i3 w9 }3 ?' D
typedef struct: i! U7 c7 O. Q; v: S
{
: i9 }( a9 r5 Z- d: {- B        unsigned int a;$ |9 j6 V- P) b3 ?" U. u$ A
        unsigned int b;
# Y7 |$ j# ]" N9 s        unsigned int packet_cout;4 g9 |2 C6 \2 k3 d) m7 ^  Z0 A0 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% ~" c$ Q6 T! q# }9 n
! x8 K) Q; m4 h+ l7 \! J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' R0 s- X- a4 g* @: [unsigned int count_copy = 0;& W  J" q$ X9 U; k' i! ]
9 N8 A5 Z( w% J# @" X! s/ l

- l& g  o0 Q6 s, |; r9 H' F* Eint main()
$ `) H) l* {8 X( e& K# t) X# ~4 t5 b{
; s# ~6 f6 r2 H! Y5 _, @        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 C8 v4 s* _5 r7 f% Z% g% J        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" n$ L6 L8 v0 ?" |- A$ O- [* g
        while(1)
6 w# Q8 _& r3 G  ^        {8 p9 p0 p) _! V
                read_MSG_buffer(pshreRAM);
+ Z3 v6 X9 ^1 B/ K1 C        }               
- Y3 M5 [' I+ W( K}
$ A1 V6 J5 N( |% ]
( H2 {- u8 \4 w2 Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ h& Z* {# q( ?5 ~0 W{/ ?" }. X) @3 `# d
        RX_MSG_PROTOCOL buf;
' e( E% L# e' L+ r        
8 T+ M6 G' U6 N# n# _1 Y% B        buf.a = pshreRAM->a;  o* i# p7 G/ H# k: h1 B
        buf.b = pshreRAM->b;  u" R9 x) n6 z9 R8 o
        buf.packet_cout = pshreRAM->packet_cout;
% ?9 l0 y1 V1 M3 n        
# ]9 |- X+ E1 p& n" o        if(buf.packet_cout != count_copy), l2 ^( N- Z& q* J
        {
) T7 x3 ?3 ^; i8 D9 S                printf("a is %d\n", buf.a);
3 Z9 r, `, U8 v# h/ h                printf("b is %d\n", buf.b);
) l9 h$ p+ k0 v/ u: x! U! _. k                printf("count is %d\n", buf.packet_cout);  [* b4 j# W& x
                count_copy = buf.packet_cout;
4 j; {. D8 ~& u- v- N2 C        }
/ i+ _2 \, t2 W0 Y# y        else
4 R- z9 j. ~: j0 |# ?% v        {& ~7 G. `+ P  L! _9 ~$ {
                printf("No effective message!");8 T3 C5 S$ f$ A# K
        }
" t/ s# C" n$ D# O}
2 B  p4 z* q$ e1 c2 e# w7 c1 |8 Z3 \1 t/ p6 X

+ k/ g4 a5 L& G# |" y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 a6 e9 z( w, h3 M
使用下面代码,对内存使用了mmap函数后:  B8 b/ `/ L! h+ C8 k2 G
#include <stdio.h>5 w( E3 ^* ~8 a& @
#include <unistd.h>- j9 ~' A+ O' \2 X! b
#include <sys/mman.h>: C- j3 V+ g6 t% o5 z9 M; V/ c
#include <sys/types.h>
3 p& q7 v9 }6 W5 m9 E: j#include <fcntl.h>$ a8 m) S- P. O2 p5 N2 C. b% H

+ g& O+ g$ c' C* O3 K#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 f+ q) ?: I6 ^8 e#define SHAER_RAM_SIZE         (0x20000)   
$ X. v. ^0 W0 z, c/ g9 G
! T) B/ J5 f& V  y+ `( Rtypedef struct
. F6 V! u4 c' s1 l{
& u! Y6 I1 T; S        unsigned int a;7 j* r# p$ M( k2 c" _
        unsigned int b;
& _/ Z$ ~' `# _# f, Z        unsigned int packet_cout;
7 }/ L8 r* [1 j- m& @8 [5 W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, P3 k3 X) T0 f9 {: `9 `; x) d# e9 j
* }: V) x1 x2 N6 Y4 z( x1 e# O
void read_MSG_buffer(int *baseaddr);! w$ b( h  X' ?4 b/ @& z& O/ w
unsigned int count_copy = 0;
. c6 s* i0 B, ~3 g0 D
% B- c: T  ~5 n6 d. Nint main()' Q8 S" b* {2 B. f- C8 d
{
9 R/ u8 f9 y& f  `3 Q7 x: H2 x7 T        int fd;
& Q. y+ g4 f/ s        int *mem = NULL;9 ]" J# U, R/ C$ U6 F( |0 w
/ _+ J$ J7 X( H+ @% _! ^4 Z( \" n
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 }6 s2 z" o, k        {
4 G, U5 }. H4 k) `5 k+ ^                perror("open error");" U4 X* L" b% q
                return -1;8 r8 x. K# ?! j6 z+ Q: J
        }9 _" Y. F5 E8 T5 q. u0 X2 x! T
        
' V9 i* [( x$ o, r        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! N5 v* D3 v7 ~  b3 n  l: U5 f' e

; U' r) I) [1 q8 }        while(1)
' ^) U! o' O. d& `  C$ i! p/ z  y' H        {
6 K! i5 D$ I# w4 ?, }                read_MSG_buffer(mem);
& Z6 V5 W4 T  U, V1 X5 b        }                ; ]6 B  |+ j2 w9 d: M) x
}
( I1 D2 [" r# _: f5 m, E: n6 O% K3 y+ @# M; R
void read_MSG_buffer(int *baseaddr)& g% {! w* q# T. c
{
. K" F1 s% r  f2 m% \# `. }9 K        pRX_MSG_PROTOCOL pshreRAM = NULL;7 c; T2 R& U! o/ ?/ e4 @( M
# M- Z5 q9 S6 e, ~4 r( z: g6 D6 a
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' J# I+ ]9 f+ |  M, s* G: V- Z, Z9 |+ m. L% F' k- q
        if(pshreRAM->packet_cout != count_copy)
) @: D9 J; ]5 o  w% X        {
1 u! A( R- j) g0 |$ D+ ~4 U/ w( {: \- B' ]                printf("a is %d\n", pshreRAM->a);
) u$ \& Z0 U( V$ \8 ~9 N  b                printf("b is %d\n", pshreRAM->b);- _5 F+ B# v5 `/ B. z; s5 \/ r: f
                printf("count is %d\n", pshreRAM->packet_cout);) e* I$ @+ o7 H
                count_copy = pshreRAM->packet_cout;( l0 g% O+ u7 G1 P, J5 J0 `
        }
* b& n' A# U/ ], M        else
' D5 d  F. {  c8 G" m        {5 i5 Z+ d9 I. P& b& p4 P
                printf("No effective message!\n");, F5 _8 [( c1 Q  L
        }
0 a" A5 B$ I; _& I: W}
+ Z6 s& [2 W( h) r' _9 w) X% [: v/ {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( E; D9 R2 o8 V; X  P* k) A2 H+ |' Q6 N9 l/ c; {: O' G

9 x& `4 }! ^' V. Q! j% H1 f+ w1 r4 M" N$ v7 K/ W
# Y6 Z* p( M7 Z$ O+ `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 11:59 , Processed in 0.043103 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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