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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 k+ T# E: _9 G+ m- @$ C+ }( z$ ^( R( x. O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 R+ l) g5 `0 @#include <unistd.h>
# o; Y6 v5 y: Z& P#include <sys/mman.h>
3 Y; N4 c: }7 D. Z#include <sys/types.h>
0 T  Q, t/ `+ N- x7 z#include <fcntl.h>
! w. U: i8 P0 g% V) a$ M+ q6 Z  J
/ X3 w, k  j' V5 Y% r#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% `8 V/ z* y: h  M- a- Q! u: t; F' |1 H$ E& I- n/ g
typedef struct
. Z# T1 q/ G8 ^( i{4 G8 U% I, H  c0 d( w9 s. E
        unsigned int a;. L4 ?$ n, e1 ~9 \! w
        unsigned int b;
9 E; K$ x2 J; b2 U& F        unsigned int packet_cout;! K: \# C. F/ h# b2 ?& g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& f- |) P( _2 @  `9 y/ j1 _: B
- B: ~! e1 t% O! z" ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ Z2 Q) K( z. Z1 q7 }unsigned int count_copy = 0;' d# U6 X1 [( `5 Z1 `+ |
  {+ E: o. m7 w1 Z: E- {8 t* I! B  Q

3 u) [; S0 u3 {" `% yint main()
+ b4 L  b3 _5 g1 |{
0 o+ {4 L! y  r! B6 {: O: c        pRX_MSG_PROTOCOL pshreRAM = NULL;! {  j5 q% I. Y5 O# K
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! A, T+ g* N/ z3 @
; m. I: d, ~$ n& [0 U        while(1)3 c8 r0 e+ h5 N& e/ [# @
        {
/ J1 i5 p2 \  C* ^. P3 q: T9 W                read_MSG_buffer(pshreRAM);
1 D% ^: I# N/ ~3 E        }               
2 r0 O9 c5 R& u* C2 {# W}8 `  S, P" |* c9 D8 G& D0 ]1 T5 J& _

) K* ^; n' n4 r& g. Qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% C: e! q* }' y, }" g
{
. j# n1 J2 S, C" Z3 k8 `2 z        RX_MSG_PROTOCOL buf;" [+ R" k: B7 r2 Y, r2 J& s: k- X
        
$ D! ^/ l# R/ w0 K+ A$ w+ O* ~        buf.a = pshreRAM->a;
1 X( Z& a& y8 t( _$ ]( X8 o$ K        buf.b = pshreRAM->b;
, \7 v2 A6 z1 I+ O; n; i2 c        buf.packet_cout = pshreRAM->packet_cout;
  ^) e8 f: ]  H5 l( C3 Q7 w4 Z7 a        
: f: n+ S: U5 O- q' H' R# _        if(buf.packet_cout != count_copy)
& P( d# S8 T- q; O        {& p% M. E  Z, E( }
                printf("a is %d\n", buf.a);: J; S( i4 w/ _. v# Y/ y2 c
                printf("b is %d\n", buf.b);
: }2 W+ e# W8 g9 [                printf("count is %d\n", buf.packet_cout);$ X) e: o3 J0 u2 r, |* G9 n2 @
                count_copy = buf.packet_cout;7 a! I  z( M+ G) v" h
        }
! t. U" y! _+ q3 d, Z# m8 }, l        else
  u9 B# z1 j8 ^: z) b        {; C$ r5 A# H9 G# J
                printf("No effective message!");, L+ o1 x7 Z; C5 \  h: S
        }% ?* R) s* l/ [( L! O+ z
}; w! z$ D: L4 F; k

( @9 X$ I( w# s9 w' o
* r! Z) t/ l* ?' X: d! v; o但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( ?: ?9 [  o1 h& [% d使用下面代码,对内存使用了mmap函数后:
8 A$ t3 t/ l8 S  O( \( y#include <stdio.h>7 X2 p& s" ^3 y( U* o4 h5 L  A
#include <unistd.h>  h, c4 Y4 x8 J$ D2 P% H0 j
#include <sys/mman.h>
5 u# [/ t  _* s5 P" Z3 H2 N2 K#include <sys/types.h>0 @( [4 o) F2 `. {/ E3 G
#include <fcntl.h>: }( t# x* V& L$ N% v/ O% l. v

6 u% L% B8 N/ j5 A% w, W#define SHAER_RAM_BASE_ADDR    (0x80000000)3 y. w8 t& [9 h6 e2 }0 Z+ s$ r
#define SHAER_RAM_SIZE         (0x20000)   
" R, V: [0 j( Y0 [* v4 v( ~2 ?' w4 j+ l3 n7 a
typedef struct9 n9 c5 q: O$ o6 q7 Z# H5 {
{# z& s6 t6 C! w! G
        unsigned int a;
5 S7 a/ l, Y/ a  b6 E        unsigned int b;
* J8 n+ w* C$ I: b! r' k. t        unsigned int packet_cout;
- g4 q! \, g- Q4 f$ }8 f; s4 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 e3 a0 S# @2 |7 [# w4 U# G1 U

7 _) I: C3 b) R- ~void read_MSG_buffer(int *baseaddr);/ k, v& r8 R0 l' d1 s3 S: i
unsigned int count_copy = 0;
, w* d1 ^1 F" e/ Y+ e. T3 |; N9 Z; G7 J
int main()
' }* j' J: P6 X. s' r9 r{
9 j; N4 G2 ^/ D0 Z        int fd;
* V  t1 ~/ p0 y# |3 R" G        int *mem = NULL;
* z, W4 r" l/ \( d$ @6 c! P" h3 B3 ]
        if((fd = open("/dev/mem", O_RDWR)) <0)! g) `6 E  j1 h5 i2 |4 n. J. M
        {/ W, J  Q) |- i6 ^3 a
                perror("open error");
! p, Y6 A- `4 ~                return -1;, U. X' A8 M  A' z6 x* a
        }
  C" e. {. S: ?6 K+ O        3 Z( I5 A- J: J
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, t% A8 p8 w+ y/ R

4 |8 V2 U5 ~; }) Y( b/ ~! h' ~        while(1)
  ?" @% M  z# |$ |" o+ C        {0 H  \( O. S: B+ Q! E
                read_MSG_buffer(mem);7 h5 \  ]4 s" B
        }                ( ~! O: W/ U+ B) v
}& L8 `9 @- t- k2 R$ N8 z
; p2 C2 m5 c0 R  @1 f) |
void read_MSG_buffer(int *baseaddr)
. i% k) J8 ?, p{
4 c* u6 ~, C  a        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 m9 U1 R+ I1 {7 h' m! }1 l7 Z
+ r" e% z3 S3 x( d9 ]; t5 @3 K        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 I' I! H% i  W, X: g$ ^1 Q1 z  W+ z0 w: k
        if(pshreRAM->packet_cout != count_copy)5 h9 ?, \4 t# P) Q& H/ P
        {
" L' K. [! G. X: t7 ?' J, G" u9 S                printf("a is %d\n", pshreRAM->a);
4 V/ f: m7 a4 n# I% h8 r                printf("b is %d\n", pshreRAM->b);
$ E, p, n* q) i( Q( f% _5 [                printf("count is %d\n", pshreRAM->packet_cout);
! V5 O% M. R+ h                count_copy = pshreRAM->packet_cout;
* ^6 D/ W; d/ Z2 V        }
4 A- E3 s$ ]3 T. R, R/ J3 f6 c9 j$ ?8 ^        else
- m9 a# ?+ X4 l; O. w4 F1 k0 j2 K        {# k3 c' G& ~* E. t
                printf("No effective message!\n");1 v' X' S& l  |6 q
        }
/ A# P! b$ [2 N! A}
, ^$ i+ F/ r. `, F! H1 S5 q' k+ _9 f: T; j/ Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  A' C  Z  k$ ~- G) x) |6 m0 \9 h1 d

' C' A4 J" o$ |9 X
- m5 e% a' j( s) }' f) f6 K8 C; S* {3 g9 d, q2 C/ b% b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-15 17:22 , Processed in 0.039878 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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