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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / I, t8 }2 Q, \3 O/ q  z+ c

8 T/ y3 t, S' h, y4 F/ y" YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* u/ J) B% q6 J! y#include <unistd.h>
8 e) C' f, Y+ u. \- e#include <sys/mman.h>
" u9 n; x3 k# g' D0 [+ ]! F8 k" {$ K#include <sys/types.h>3 U3 m- A# K& ]  s0 ^
#include <fcntl.h>
, y! r/ r: r: r0 D- Q$ Q
" c, @; R1 _+ `) A#define SHAER_RAM_BASE_ADDR    (0x80000000)   & Y$ ^; N8 |7 I% d( X4 @- _

/ X* F$ P9 b0 e9 I3 b6 q8 mtypedef struct4 c1 c/ @* ?# R  T: m) i  `. M
{" Y! {! ]7 |, d* R3 |" `0 n, ]
        unsigned int a;
& u0 b' E3 F2 G, V        unsigned int b;1 [" m' G0 h6 P4 s* h4 E- [; }( @% x
        unsigned int packet_cout;
& u, D' _" V! |& W2 X  Q( V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ x5 s2 X2 R. c! U" [1 e3 q
' V  \* G7 F' P  k9 h" hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% Y' J5 h, V$ u8 junsigned int count_copy = 0;: A+ P! P4 p0 h* e! _# U

/ \+ Y+ B/ x) `: B% L+ b/ ]- Z( _6 X- O  a) \
int main()* V5 k2 ^- T+ c
{
& f/ v5 D+ G; R# K2 z/ V9 |( s        pRX_MSG_PROTOCOL pshreRAM = NULL;$ R0 u& X. n# E& _* X: A6 v
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 j; `/ F$ e8 q6 m9 z* W5 B

: i' P3 f! A8 I& W        while(1)+ T3 U/ z( v) a: d0 X4 M$ J$ {
        {
  u" ^1 |/ R. q9 l$ f                read_MSG_buffer(pshreRAM);% J! Y# q# b6 u4 |2 h
        }               
1 |: ?5 b+ i4 V* J  K}9 L6 a, G. R7 Y7 Q5 U
+ l' L1 q/ n6 P: f) Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" m! l5 m. T9 p' x% \# H+ A7 w{/ h- R6 O5 K" A1 t" o+ u  G
        RX_MSG_PROTOCOL buf;) F4 q4 u  O' i! m, q$ Y4 Q. n
        
8 n! v" |: e% [6 m; b        buf.a = pshreRAM->a;1 E1 t4 z) j8 e8 `* A( O' ^
        buf.b = pshreRAM->b;
2 }, B% t* {( E, t- b( E3 C2 g        buf.packet_cout = pshreRAM->packet_cout;
1 `2 z; Q0 |' c0 l! p# |* V- l/ i, M        ( p4 Q+ k. A/ Y  R; b+ a  _
        if(buf.packet_cout != count_copy)0 t4 ~" t. W& f) \  b
        {
0 t, e8 F9 U; Z& w2 ?% e: A- k% S9 d                printf("a is %d\n", buf.a);
* D9 @( Q; t0 ?3 I1 Y                printf("b is %d\n", buf.b);
' p3 X# ^3 T) B                printf("count is %d\n", buf.packet_cout);
5 r7 U% I) B2 B$ |) M                count_copy = buf.packet_cout;0 x* C5 L* v; k3 E, j
        }
) T7 \9 H5 J$ n. W        else
% U7 _# m. c4 d$ a        {! M) f* ^- E2 v/ N' A# s
                printf("No effective message!");. x- Y' e* K2 ~. v
        }! v& c  h. R* T6 I* U5 d
}
8 C* e. s4 p& B/ v- t+ v% q$ `, h. R/ m% n8 G% a6 y

3 ]; ^9 ^: f/ Z" Z5 H但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- F6 }, P9 }! i. Z
使用下面代码,对内存使用了mmap函数后:
7 m  v* p4 d2 Q#include <stdio.h>! I4 }4 x8 s. _" S& Q% p
#include <unistd.h>7 q0 ~. I, \6 R  i
#include <sys/mman.h>" X( S* D. w5 s$ B, n: F2 ^
#include <sys/types.h>4 w' D5 j. C1 n, m/ W( q7 z
#include <fcntl.h>/ B2 Q  o7 {& b& w3 z% y) V  V) }2 T1 S
6 g+ c$ X7 Q; F3 K) Q1 t0 V: M# h0 i
#define SHAER_RAM_BASE_ADDR    (0x80000000). G) X* R  j& x+ w& h/ U- j' ~  g
#define SHAER_RAM_SIZE         (0x20000)   ; H# v) c( E5 c: |( a5 a

: b& L" s( z. o9 s& H) Q9 o) ltypedef struct6 U; V2 T7 G: U$ o7 t3 B: A
{
' o5 J' Y' p. T! K        unsigned int a;0 k5 z% B$ K2 d. i2 g6 N1 C3 c( R: ]
        unsigned int b;% w( X* {4 u7 b4 Z$ y$ L. R
        unsigned int packet_cout;
9 }3 y/ c/ B' v  P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# o. f' z" T7 t9 n2 b. y! u
8 H4 M" k( o3 X" ?void read_MSG_buffer(int *baseaddr);4 |. S) }5 m- M' ?. p4 e9 v; t
unsigned int count_copy = 0;
/ V4 ~4 h3 U8 y! o% G* Z: d/ v" O- D
) Z, ?" i. M% i' Z# [% S7 C& Z6 wint main()) w' Y1 f2 X% B
{$ ~* ?" K6 s& ?  l/ v
        int fd;9 J1 z( y% ^. U+ E* D
        int *mem = NULL;
; J- S, `3 H6 o+ ]# [+ _
  z5 `) Z2 m3 z& z: k        if((fd = open("/dev/mem", O_RDWR)) <0): B' Z3 y7 q2 D% c* F2 C' t1 Z
        {8 Y0 Z! H, Q/ t1 U
                perror("open error");& z( w! q) l, [$ e: Y
                return -1;4 i! o2 s3 t! l+ L
        }
7 j1 D# l) I. ~( G( v% U# q- S        3 _$ S) P+ c# Z: T# ?; J) M
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% ^" t: `, K0 o
( J4 ~( L8 t) P  P1 i
        while(1)
; @& M& e8 W; x, g6 `        {) D+ f/ _) w0 f
                read_MSG_buffer(mem);
5 |4 G' d! a" g" E; k" _        }               
- \2 d* t1 r7 J7 Y  k' s; q' C}% k, C' R  ~- @  W8 G

9 L) I/ q7 W7 k8 Fvoid read_MSG_buffer(int *baseaddr)  L; c0 l+ g/ G/ ^; H
{
! b( |& R$ ^% [/ N# a/ v5 v7 x        pRX_MSG_PROTOCOL pshreRAM = NULL;
' c2 a' o! [+ ]1 `! M; f9 v
/ I  W) U- o" H- \        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# d* T4 x9 ^0 |# d3 @
2 T- o7 h* Q) i8 ]" p5 E7 @7 ^        if(pshreRAM->packet_cout != count_copy)& ?. n9 n# f% v# z; J9 T
        {6 c- V0 J% J$ G9 t6 `5 X  W0 U
                printf("a is %d\n", pshreRAM->a);! h# P, n5 c+ e
                printf("b is %d\n", pshreRAM->b);
" u! S7 c: e: G) W                printf("count is %d\n", pshreRAM->packet_cout);
, K/ c# k, n, \8 a5 T                count_copy = pshreRAM->packet_cout;1 @1 j1 ?! s+ |/ G
        }
7 a# y, b5 C  N( U1 E7 M        else
" U* T3 e. l3 Q( J        {) m: P! f: m; N8 w
                printf("No effective message!\n");
" q0 X: I+ z6 \9 d, I        }
8 ]0 X' ]& E6 G1 b}
2 T* n6 F7 K, f) e8 g8 s
- I, T4 c4 d# f! X% }5 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! W3 b" {2 n2 e8 P0 x) C# j

* U, M3 H7 u" W* h
, Z0 N& C% R+ I" D8 i* z2 V! ~- |0 f% B9 n2 ~. M! D4 d
2 Z" \! q4 G) P  B. w) h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-19 08:05 , Processed in 0.040436 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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