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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! a. G  ]) D6 v& [
0 N: h9 j0 ~; c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; J. N0 u) {3 X( U7 a+ m$ {, U) S
#include <unistd.h>- n- {$ p8 f7 Q3 e5 K" g  N- |
#include <sys/mman.h>
- N1 c' B* U0 ?9 r) r#include <sys/types.h>
4 A/ s: X9 C  ?& D#include <fcntl.h>
3 ]6 g+ J2 k3 h8 X2 C, Y7 |' u# t, J: q( k% F+ D/ a& k
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 v; k' d6 w6 N, F- E8 z
6 c9 a% ~2 w' r, {( p0 |, P; @8 C) U% utypedef struct' [( @1 S$ z1 V* d
{* Q; P  t: m# \( V& `4 S
        unsigned int a;
( J* x- p$ b1 Q4 I6 [; ], p8 v        unsigned int b;" x7 j; [, G2 v' X2 Q& d
        unsigned int packet_cout;% V+ H- g2 |6 \4 t) ~7 G- u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' x- ]9 L% t) D* d+ |/ ?. X  i2 O- m4 b. ]/ G& q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% A8 B. `6 R% N' Q% ~unsigned int count_copy = 0;  R. {3 P1 k# G' a2 u1 E" I
7 c6 c2 t: O$ Y: F, Q3 U# i

8 ]6 G2 k' I/ Y+ z) iint main(); A1 Q9 ]5 P* ]3 B2 L. I
{
8 E, X5 m4 _: j        pRX_MSG_PROTOCOL pshreRAM = NULL;0 J( ?! c$ e( }+ V: D- ^
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! g  D: V- y  ]1 F0 m. j! D
* p4 O5 n  ~" b9 t. k0 _
        while(1)
( e& b# ?- T+ W' \- V        {
1 f  p6 p. X: s. |                read_MSG_buffer(pshreRAM);6 A6 g, {6 O8 P3 V+ e; G  R
        }                ' |7 A5 C7 O5 i. R- o+ Z0 ?& m- ~
}
* c$ _) C) m4 B" y" J* Q1 L# G0 s9 h# t( @; p/ ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' i, m$ L1 V" A{
* {6 Q* ^$ Q9 H) C0 S# L- n        RX_MSG_PROTOCOL buf;/ q: e0 p6 l% V2 V7 V: t9 k
        / W) l7 m/ P+ T7 G! G% P/ N
        buf.a = pshreRAM->a;
. M$ l; C% ^! L- ?1 ^        buf.b = pshreRAM->b;0 }" M! K7 _) f  C7 [; ?
        buf.packet_cout = pshreRAM->packet_cout;
. u; E. k: Z9 Q- D9 Q        7 }/ S# U# [  i: m9 Y/ i2 G- O
        if(buf.packet_cout != count_copy)
" w0 _& h8 R! J, _        {
5 x: p% K, d9 b% d8 E5 Q+ w* f                printf("a is %d\n", buf.a);% E7 p- c' ^( y% c) E; S0 v) `
                printf("b is %d\n", buf.b);6 i8 E! B$ Q2 N7 t
                printf("count is %d\n", buf.packet_cout);. _' Q- \1 l& Z
                count_copy = buf.packet_cout;% `" l2 }- ]& R# D
        }
+ n+ n4 t* f' {$ Q. s  P7 f        else
5 l1 a! p' j2 d+ y3 y- _4 H' Y7 F6 |        {
% D/ K8 y/ G+ z  J/ |1 s5 s                printf("No effective message!");# o" Q! C) m7 H  a
        }
1 g/ E- h- {0 B/ m# f}/ [( P# z! ~$ a5 f4 I9 J& M
) a1 [3 P  a6 ]

  r( O+ ]8 C( t, f- D+ D4 n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 g$ X* k4 c9 D5 v1 E: B6 Q
使用下面代码,对内存使用了mmap函数后:
# }. o( @* @. D' O9 x# |#include <stdio.h>
: P. v# i8 `) P( ?/ ]1 j7 ?#include <unistd.h>2 n# f7 B; Z8 k" ?" W7 y1 o
#include <sys/mman.h>
3 W, J# O5 r3 n  j5 l  D#include <sys/types.h>
9 q. d4 S7 }6 s1 g$ y; I( N#include <fcntl.h>4 q5 w9 Y" ?" X7 Y" ^; n5 E

' h1 }9 W  L9 _. {# t: q#define SHAER_RAM_BASE_ADDR    (0x80000000)9 |% H$ |* N% e- K
#define SHAER_RAM_SIZE         (0x20000)   
/ U* O" Q+ X: ~' W% T, O9 X3 t+ g" q, W+ [/ T  R* [
typedef struct2 \. a  n- n: ?/ i
{2 P9 v) ~7 j# r
        unsigned int a;
' V! t7 k* W. W9 ^$ g0 A        unsigned int b;
) l1 q" P9 [. {0 f7 `        unsigned int packet_cout;5 _) z1 L0 v/ S3 P* D2 |! w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" I& }+ M) J2 e3 a6 N  P
$ R/ Q3 ^* G) u
void read_MSG_buffer(int *baseaddr);! B' U1 M" U& j& p. X/ N
unsigned int count_copy = 0;
! e! g& v1 P+ W8 T. h+ v, v
" d7 Q3 p( y; c3 J6 u9 T# fint main()& |- M' G. l7 K2 a$ ^
{
, y( L2 p3 o. G& o8 O( ^0 K        int fd;! Q* X0 w% T; k. u- U; F
        int *mem = NULL;
, w" u+ @! J& H) b+ z: K. ~' E* W/ t2 g
        if((fd = open("/dev/mem", O_RDWR)) <0)
3 m' s9 ^3 e/ ]  `        {/ k' q5 w& h* R0 L: N8 y
                perror("open error");. v; Z. b% a0 d9 a
                return -1;
) a& I  ^  {7 y  g9 R0 f+ |' M; v        }
7 u0 D, u$ K7 _4 j  ]        / Z" i! w' }7 b( N/ N8 f# R
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 ^4 i1 I: M8 i: s& S  `  p8 q

2 V8 j# O: {( p; M1 w        while(1)
  u8 P6 v" @% I* z        {3 t- S$ b$ k+ p
                read_MSG_buffer(mem);
# T+ ?3 r% b/ j) {4 v        }               
" O8 R1 e6 N) E. B. A}
; `8 q4 l' q( t
2 u: C. E* H: fvoid read_MSG_buffer(int *baseaddr)' d7 J9 h" |# Q) V! h; s
{" C5 u' K! }+ e1 h% g
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 `) b' r' Q  ~( v
1 K) g6 \; O  O+ M: N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- @3 r3 Y: @$ H* ?

; y0 o; A: g" }' ?/ P- I8 {        if(pshreRAM->packet_cout != count_copy)
2 K* k* ]4 R8 y' [, O. E+ _        {  D- N$ @! J( ?# d
                printf("a is %d\n", pshreRAM->a);( X0 m' h3 n- z9 U# Y, u: `; E
                printf("b is %d\n", pshreRAM->b);& a" M; j9 E% G, k8 X9 x0 z
                printf("count is %d\n", pshreRAM->packet_cout);# D  K# J: F8 Y+ v
                count_copy = pshreRAM->packet_cout;" s5 }* A+ s6 Y/ @8 ?9 c
        }3 E7 U, q( N5 L5 g: {
        else
/ u& x6 f! i: S; I' y        {2 B( V1 ?7 _, ]
                printf("No effective message!\n");
, ^( A6 ]$ Y; B" |' v        }
8 C) g! |$ B$ @& |4 Q}
& o( j3 R+ M! e+ T( T! T# ]! b4 p- N8 a8 u' N! K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 X1 ?: s. P) w' g8 ?5 G! r$ h' W2 |

0 W# _* J9 h3 y+ e9 S" Z$ b, Y! E: o! p
* q2 D5 n! ?1 ]8 @4 d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-2 01:02 , Processed in 0.039747 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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