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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( k/ |" t8 C, [7 X  J
6 g3 o* @4 Q3 m4 [OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! R1 ]; T3 @+ f+ v  A#include <unistd.h>
+ l0 Q$ z3 k* M#include <sys/mman.h>
" C  \. H. t' ]" v# k- D+ D#include <sys/types.h>: I! e* r4 P2 B# E
#include <fcntl.h>; g% N  u# ^* r  Q% i' |

4 J* C5 e- }2 ?; h% W% C#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  E" ?3 K6 B' L  u- @! c; i4 z3 _/ C( t, _! ^6 T: a
typedef struct# b* _- p1 }5 W; c" T# v
{- K' G8 s+ @0 m$ |
        unsigned int a;
3 E0 s7 \% f& G0 y* `" v9 C        unsigned int b;
! @9 g' i8 Y1 W* N        unsigned int packet_cout;# ~& _8 n  \2 m  E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& T4 U, \3 |' b) e! x& Q- Z0 [' @( V- f: ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! I1 v$ }- ~- V1 I6 u% m, w2 B
unsigned int count_copy = 0;7 ]" D' s4 w0 x5 e; W* I
7 o4 I4 |2 n' ?7 _/ A/ \1 b

* e2 I! m2 `: D& A. Q3 ^int main()
; J9 p% N* e' J* V9 M8 X  p; L{
- [  w5 [( g( l) N4 z% i        pRX_MSG_PROTOCOL pshreRAM = NULL;  J3 H; k: m* O. t
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 W6 s6 ?/ n' Q. i

5 l& t. s% e/ t        while(1)
& ?* r# n. W& X# X2 S0 z1 w) T        {* R8 A' z/ Y! X; g; O* G
                read_MSG_buffer(pshreRAM);0 r  U+ r3 }  c* |# b: k7 F6 G
        }                - w  \/ R! E1 A, L' j+ D) z/ c
}* N/ `5 Y; ~, w. v) I4 ]3 k3 w

' P+ Z" T0 y! ]( ^# Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- W$ |9 d2 h  j/ C2 f
{2 Q& b6 E9 p- @( d5 }
        RX_MSG_PROTOCOL buf;& c+ l. Z* k+ o# U4 s* x
        
( z# [2 B. ?2 u+ o! I1 ]        buf.a = pshreRAM->a;( A2 j1 Y: r- [5 x' p) L
        buf.b = pshreRAM->b;
. H5 h" x" d9 ]7 k1 o4 M        buf.packet_cout = pshreRAM->packet_cout;
7 y+ X, D4 H5 l  {) k6 w) `        
( y/ C  ^/ @6 B" E        if(buf.packet_cout != count_copy)
- W. Z' ~: S1 {, y  w/ d7 a        {7 f) M. S& z, I. K" g4 ~
                printf("a is %d\n", buf.a);
( z& \% y! ?" t5 w' S& ?7 k8 u                printf("b is %d\n", buf.b);
+ ~0 C, k; B) R1 E2 y                printf("count is %d\n", buf.packet_cout);
; ^) O; {$ t4 ^5 L                count_copy = buf.packet_cout;- R, m9 q; e) z9 g1 l
        }
8 |: i" ]( Q. r" L/ O% G        else
/ R, P3 K) ?- E9 p- m        {6 I+ ]: [8 R/ U, r: f& ]) i6 E' C
                printf("No effective message!");
& L6 W2 N) m5 u        }" p& }1 Q4 ~' o3 t1 L( ~
}
- _1 H" H. r+ f$ @% D  j& o! ^2 x0 b5 s. ]0 e* V. `! h0 n
& j* }3 X, I& i+ J9 T! G
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 e# m! t& i3 y# `
使用下面代码,对内存使用了mmap函数后:0 V& j2 w7 _+ D. Z1 V8 s1 x
#include <stdio.h>% x" _* M# P$ v
#include <unistd.h>
) y9 R. c6 c& L# T4 t#include <sys/mman.h>
& N" R8 E, Z9 k  N" _% x3 b. c#include <sys/types.h>, k/ `  R4 Z) N3 H# F9 Z
#include <fcntl.h>
. K) k) L4 Q$ |! S  t+ I6 k( C: _: f
3 T' {- V! s" }* @1 i#define SHAER_RAM_BASE_ADDR    (0x80000000)
8 V! D' [3 @* I#define SHAER_RAM_SIZE         (0x20000)   
" z5 d' P# F! \- c1 C( a4 `# y( U/ e* A; h5 z2 u: t5 M
typedef struct
7 @0 B% b) i% d{9 @2 N" A1 a: Y5 x! B* E6 ^' k4 S
        unsigned int a;! C: o' @1 B& }. R: t6 B
        unsigned int b;
; }+ q0 D% s/ y        unsigned int packet_cout;7 v$ n- `" q/ Q7 ?+ F$ c3 f0 r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  V6 c+ D( Z; c# G1 p) L4 H+ t, u4 ~; ^% M, s* K) d7 P
void read_MSG_buffer(int *baseaddr);% L; R% b0 s2 g; }6 T
unsigned int count_copy = 0;
  R" c4 I8 ]# \5 X9 w8 g7 @: C5 y  G
int main()
' k7 V; G3 R; D+ N{
2 u5 Y. l0 O5 x3 a7 u        int fd;) t0 V+ @" O7 N$ r9 o3 G, ^
        int *mem = NULL;* r) W% L9 v8 I: D* v7 U
& r( _6 `8 M- q& S8 p
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 S. g  p2 T5 A: Y# I! Z7 u, s$ E        {
; O" C! V" F8 Q: c0 N: g                perror("open error");/ D, I+ Q; z% b7 Q/ q* c! k
                return -1;7 X$ E; s! T  ?' R6 D2 ]
        }
8 E  N9 b7 p" U0 ]- v% [        8 G$ L: l- K( Y1 P" c. b) X( C/ f. O
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( b/ `, z& `9 n% d7 y

6 t, x9 ]- m2 v. V        while(1)" y8 _0 U! J% K. t9 w/ [
        {, U( h% `1 x. ?- e' ^, g
                read_MSG_buffer(mem);
& A6 [4 V- k/ U6 R8 ]        }               
" x/ U: d+ m4 [7 ]# \3 h}
$ a% n3 d( f, m, V! m0 X% T
+ e% Y6 c8 \4 e3 d2 k9 t' Qvoid read_MSG_buffer(int *baseaddr)
# W& V: D' j6 ^: p{* h5 v: V! Y6 Y3 g, C* |  B  ^* t, [" S
        pRX_MSG_PROTOCOL pshreRAM = NULL;: Y  m# B* l6 {4 m( l

( M! a' ?1 w# R        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* T% x$ H; Q7 F
' }% r8 E6 W5 Y        if(pshreRAM->packet_cout != count_copy)8 Y' p+ R- s8 d
        {
( j, g# |& d5 y                printf("a is %d\n", pshreRAM->a);
& ^4 {) w: h/ o2 c  a% e                printf("b is %d\n", pshreRAM->b);
$ ]) T# |5 ]4 P8 ]3 F) |7 d                printf("count is %d\n", pshreRAM->packet_cout);
" W( ?: ?. ^8 B& V6 K; F                count_copy = pshreRAM->packet_cout;. h: o  w) H' ^& a
        }7 A/ Q) E" q: i8 v2 X- q
        else/ D# r; n6 `: O! `2 q5 _9 }8 k
        {1 m! v( q6 q) |
                printf("No effective message!\n");
4 k1 F- \# O1 O0 l% e2 S        }
# j1 t0 }/ o0 b4 X% e1 O}9 ]" K) T8 u$ l7 @
7 A9 C' w, I3 l3 D  S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ g% L; U2 ?, ~  M
. I9 K. U/ F, ]: \$ [1 T6 U  m  I3 B2 T& y1 p4 l
* c/ A" k* C7 z- z9 m( ~  `

% \2 L! Y7 r( H* D3 k) o9 X6 o3 U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 06:24 , Processed in 0.039808 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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