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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) @8 V5 w' _" e4 Q+ c
5 Y. k" V8 D1 \OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 [: K% O9 A8 ?! _
#include <unistd.h>3 \* w) X, I: C7 K7 @
#include <sys/mman.h>. f0 Z: u* P! w8 K7 Q$ S& ?2 s
#include <sys/types.h>7 U, w8 G6 l) D2 L4 ~
#include <fcntl.h>
6 r& H- @1 X* `) V1 Q
. N4 D% d% T% E9 s7 K3 A9 y5 @#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 m, B; @4 F' A, T# C' N4 J4 S' X$ V0 v9 O0 s7 E$ k( F& K
typedef struct3 O- e1 J9 Y( `5 p% U/ z8 k" g
{! i1 s+ F; I* [6 _" e
        unsigned int a;' X- K/ @6 [# q' P. U
        unsigned int b;/ F: d: `0 D/ h9 R
        unsigned int packet_cout;
0 @- L5 K: ~0 q2 P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& l: ?# b2 d9 j3 r5 F
8 N) ?& D. O8 g( Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 C7 G$ Z1 {( e( k/ T7 ~unsigned int count_copy = 0;
" B9 I  X# k8 V+ c. h$ A& R8 ?) m3 K  l- g( A: a& T; c% w4 X
( G6 e& Z8 T1 Q+ [
int main()* _$ w9 y  I2 N* g( b* P% Q8 m
{' \. v" @# G6 W8 n" k: o! u- ]6 \' B
        pRX_MSG_PROTOCOL pshreRAM = NULL;: Z0 w; M. y8 t. L
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: d1 \( Y- ]) S/ V# X8 j
! T/ G% M7 @- j9 t        while(1)7 x1 V4 l. y/ V
        {( r8 _, @9 Z: a/ @+ W
                read_MSG_buffer(pshreRAM);. @" y/ t5 h' w" t
        }               
# R2 L8 v0 r6 i/ n}
3 n' }$ X9 N7 a/ B3 K6 T
, \' X+ B& j% }7 T4 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% F7 ~. C4 H7 R8 X5 f' g& [$ A{
4 F5 H0 U, u4 ]  k3 W/ e        RX_MSG_PROTOCOL buf;
! y4 d8 s  Y& O( _! F        & I8 z. o6 ?7 ~; f/ l: W' P
        buf.a = pshreRAM->a;4 A8 `* ]. }' E, o/ z1 S3 A
        buf.b = pshreRAM->b;1 L1 J: c) ~& J! ?2 Q' X/ U
        buf.packet_cout = pshreRAM->packet_cout;
9 X) k6 C+ |8 m) g, g$ I3 n' Z1 `$ e        
. _; S8 r1 I/ r0 y( N3 W% s9 `- t        if(buf.packet_cout != count_copy)
/ X$ G) Z+ v8 K! E. |        {* A6 e& O: F; ^& Z  Q  M
                printf("a is %d\n", buf.a);  ?, n6 {7 w" w* u
                printf("b is %d\n", buf.b);8 Q( `0 n4 T0 j: i% C
                printf("count is %d\n", buf.packet_cout);
/ }+ M/ C3 O' _; t2 d                count_copy = buf.packet_cout;
' p5 B% R, y9 ?1 v+ W2 O        }
, H5 A& q: R+ L1 E- c# _        else
) v) t, o8 B/ U! X        {7 }8 H; s1 y) G. N6 l/ g
                printf("No effective message!");! ^  N, z% x' {
        }( r2 z* V6 W5 ]6 Q- ?9 }+ b& H
}
( B, A6 X& W8 w$ d6 u7 y- B/ [" W7 [4 y4 ^

) s" X# g4 @5 O/ e- B' u但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" E/ h3 T# r* j$ n8 i使用下面代码,对内存使用了mmap函数后:) O# u9 S2 s8 V
#include <stdio.h>
: H$ }+ |3 s% \8 W6 C, T7 d#include <unistd.h>
5 x' f6 Y+ V2 o9 S#include <sys/mman.h>
2 U, Q2 [- E9 X6 c#include <sys/types.h>
  U9 p' |0 Z; c2 D, t#include <fcntl.h>
8 g9 V* m/ J/ s& I
6 ?" |$ ?: O+ V* A+ S$ C. t' c: g#define SHAER_RAM_BASE_ADDR    (0x80000000)
: p# R+ z1 D7 a$ ]6 o5 y#define SHAER_RAM_SIZE         (0x20000)   % z/ N5 ?% w! ~5 N+ ^1 g& X7 Y: \* d
: N5 h* I% H$ U: D: X9 b: \
typedef struct
( Z3 U7 _6 z+ q( O5 \$ e0 i{
) a' Q" Z% d- ?. r: o' u. U        unsigned int a;
( l  K0 _) Q$ `        unsigned int b;
3 E+ t/ V+ J" N) E' E        unsigned int packet_cout;
6 k' C/ k$ X, Z0 U/ O. C6 n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 A# ]8 Y& G  {  J- q0 ^
' L5 s. O$ G' w' z- dvoid read_MSG_buffer(int *baseaddr);, R6 {9 ~: {9 I+ m" n
unsigned int count_copy = 0;
) X0 D+ l7 b( k# Q9 h* A
* R4 |0 e' G/ l, U; ?int main()
3 n$ }- s6 f4 h1 m  @/ Y+ [{
* U/ K5 n; \3 _1 q- e        int fd;; R5 C) B" ?' }8 ], v) g- _
        int *mem = NULL;
& S# h7 R7 f5 L1 v0 F7 E
. F; Q( u& T3 P+ n        if((fd = open("/dev/mem", O_RDWR)) <0)7 k" B) N. w5 u  L
        {4 y+ A! X, ^+ f# b! h* O
                perror("open error");: v) j, ]6 R" m. y
                return -1;, t( J) t) S- r% ]
        }
9 l3 r* w8 A/ w: r8 v9 N1 A        
4 Q* k- O2 O$ X$ U" ^        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 R. V1 O$ Q3 ?, z& S8 w( P

4 c7 |9 ?5 A0 C* @3 R8 V        while(1)
" U: M6 _" O2 c$ |+ A" I" J0 U        {
5 u4 y7 v- }' q! E                read_MSG_buffer(mem);
% B' l; D: g: f3 d        }               
  I& o6 F5 w( l& d$ m}
8 \8 x# U& j& G. v8 `  s  a( C6 I* x$ i# t% B" l: I
void read_MSG_buffer(int *baseaddr)3 p6 a# T0 V' A) T  y
{
6 \! P" k/ v( f0 R% D5 v. ]! K4 x        pRX_MSG_PROTOCOL pshreRAM = NULL;; b  F  O+ T, w
* Z5 o/ A4 b9 C+ v) w4 F
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 u5 N$ [' M1 D- H3 y: p3 E* u6 D3 L: W  V9 y& s
        if(pshreRAM->packet_cout != count_copy)
* I& q$ P+ \4 z5 S0 C! Y1 w        {" U1 Y# S6 f" p- ^
                printf("a is %d\n", pshreRAM->a);
) X; w. o. f4 E5 z# S; d* D                printf("b is %d\n", pshreRAM->b);( F$ Q( a5 Z8 a% ?
                printf("count is %d\n", pshreRAM->packet_cout);& _* ]7 x8 G6 O0 M
                count_copy = pshreRAM->packet_cout;
# t, s: U+ C( Y        }; w7 ?$ l  _* F% H# K, {$ Q
        else& v, b9 `- D0 Q5 F8 j4 a
        {! D1 }* \1 ?6 U9 k
                printf("No effective message!\n");
7 W0 `0 ]/ T; W3 _/ G        }
3 {6 j* @7 k- v0 P' t  P8 Y- s}! ?, T% L( s; H
+ P. V) G% r( h' l! p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 f5 f% V3 B' r4 [  H8 V
- V8 e. k! R2 s. w4 a3 G2 S; t
: }" D3 W: S9 c5 U" a5 \0 k

1 {9 d: ~1 k" Q
, z" j. s$ B2 E3 H8 j1 o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 12:42 , Processed in 0.036573 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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