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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) T' U+ ^% k' B1 m

* I! ^$ k* y) h1 j/ fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ b2 A5 u# q# V" J$ H#include <unistd.h>
$ p- U7 N. _0 O7 ^, ~& T#include <sys/mman.h>. _* S! Z: [+ h: _+ q  X+ g
#include <sys/types.h>3 N+ k' N" H' a7 u
#include <fcntl.h>& u' z4 O. A# L
1 |7 ^- Q0 [, u8 z6 |, @# t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, @- W9 G2 F: l' j3 f$ Q' S
8 Z* W1 d2 R" P5 qtypedef struct
7 D1 w3 R: a: O{4 ?6 J% `* L% J
        unsigned int a;
; v; \0 z! `. H- x        unsigned int b;  P3 \: m$ H9 V/ J  D
        unsigned int packet_cout;
. K  b9 h7 t; Y8 X+ h; ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' Q) A5 Z( l% E/ M* o
1 M; j. v' ^" xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 n% V+ O9 D  l
unsigned int count_copy = 0;
0 V! u  l- a' D/ w. `; F/ M" y. A. K) K, P6 x4 M; a) z# \' e6 |
/ n- [) z, A2 d( R' t
int main()
9 P3 [- h0 [# z! \, ?4 \. j{
( W$ Q* n' o3 g0 [8 C+ z8 h& G$ \        pRX_MSG_PROTOCOL pshreRAM = NULL;0 U+ P5 a, y5 G+ A3 d5 r
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; T# Z# w2 i/ q9 g, G& ~

9 Z' E" J8 N  Y8 E* Q8 F        while(1)! e; \2 w. m& a' J, K
        {
6 q) Q. L  a% B) C- h' I, Q                read_MSG_buffer(pshreRAM);+ ~1 E, N( r0 g
        }                2 e- N* `' h6 \; R4 d8 U3 u& `/ j
}1 B7 N, }0 z# d' b1 A) l
3 S/ `9 I' w0 t. h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ J# J( R5 [& W' f
{) a3 I  `' x' [! b) n% W2 i
        RX_MSG_PROTOCOL buf;1 G6 M$ i3 F& M4 I, }
        & T& J* v* z3 ?3 c- G7 T
        buf.a = pshreRAM->a;) e1 K$ I8 r( J5 B
        buf.b = pshreRAM->b;" Y4 k. n6 }( w; v% l! O
        buf.packet_cout = pshreRAM->packet_cout;; J7 @2 F3 s1 s8 b( ~8 ?
        
) J  o2 l0 W) c  A0 b+ O        if(buf.packet_cout != count_copy)
: Z- l( |+ i; s$ k# X5 Q        {
, D' t# Q8 F5 p  w; k& P6 i  ?7 R  ]                printf("a is %d\n", buf.a);
( g/ M' O  O3 M7 w, m. z2 p9 T. Z                printf("b is %d\n", buf.b);
% N7 N) b8 M/ j& Z                printf("count is %d\n", buf.packet_cout);2 g" _. w% T. O* `/ D) }) y% j
                count_copy = buf.packet_cout;2 \3 q% @& c7 `- X7 T3 g' M; K' V- r2 q
        }
$ r" F4 K2 r# B% n9 w/ i        else' B* P/ M0 `" m5 b/ R  n; N( V
        {
# B0 r- J# C5 @- ]" a                printf("No effective message!");, c+ J" T1 t# O4 a, Q% o( K7 K1 G
        }
, E. j0 [9 [$ W. Q}
4 Z+ ], l& l' g1 {/ f& j$ u& {9 b7 B7 w- ^  f0 w
0 L0 D# r' m/ V. q* c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" Y  ^5 z1 c# {4 `1 e/ `使用下面代码,对内存使用了mmap函数后:8 Z4 z( l: g3 G9 Z# v. ~
#include <stdio.h>
$ N. H5 s1 o+ [4 l1 n7 o9 P1 i$ V#include <unistd.h>
* g8 {* l2 b* @; t5 _) ^#include <sys/mman.h>% J! X2 ?% y1 m6 U; C& u& H
#include <sys/types.h>" @4 G" ~4 n% o5 N
#include <fcntl.h>" b: V! U: A6 E! U2 H
1 t  m! U5 s; d- a7 g( P' A
#define SHAER_RAM_BASE_ADDR    (0x80000000)
( J+ o6 c0 s; {- b2 }" u6 k5 G#define SHAER_RAM_SIZE         (0x20000)   6 [- e5 e% q2 p2 ^3 Y
; o9 P( S! D; z+ ~7 U+ U
typedef struct6 p. H9 R4 b3 }2 V% ^- N
{
  u; R: [4 N  B, i" k        unsigned int a;
' G. `% ~: t; G# V% d0 k/ S+ m        unsigned int b;: }7 q2 y: M+ R+ N* {
        unsigned int packet_cout;- g% f2 ]& V( T5 i+ y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 {$ u( B3 S7 P
9 t2 t0 g: v3 y3 wvoid read_MSG_buffer(int *baseaddr);
3 M9 S! B$ e2 W" `. k) N# J9 h+ g) _unsigned int count_copy = 0;
" ^( w4 S8 E+ U9 E% W4 t
- P" @" b7 x4 W7 n& Xint main()0 i$ b& M# ]8 S2 y
{* d3 r, b7 n+ b5 M; x
        int fd;
$ x: [/ d$ g( i: K% O' \  K        int *mem = NULL;4 z! F* W) b* S& f/ E" d
1 J: ?4 F" _* R. u% [& S& ?
        if((fd = open("/dev/mem", O_RDWR)) <0)- `9 _3 o! i9 r4 {3 N8 R" |
        {% d  p  U& y! k  H
                perror("open error");
. D, q- _* y9 c& y                return -1;
3 H- x/ R- f4 d0 }4 Y1 C2 g4 }9 c% v        }! o% H1 x4 M( L* ]3 y) ?
        
% V3 n4 I  U0 W* k& k! t* |! [        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" {: |* `& T2 s% V5 D/ _
% x( `/ R! D1 Q' N3 R: b; C        while(1)
* W; k6 R# g+ g: q& ]' m        {' v, t& @( t& \7 Z* l8 g
                read_MSG_buffer(mem);
" Q2 {% Z! `0 R7 {        }               
, r! {6 T9 }6 B/ H& u: B1 F# l}
- I* a" ?$ Y7 @7 @8 Y) n4 s) g" a* `& A' C! ^  c7 A
void read_MSG_buffer(int *baseaddr). M. |9 S  p: j* v
{
" R% P& |2 G2 D8 J3 ]+ c$ ?+ c        pRX_MSG_PROTOCOL pshreRAM = NULL;
' _" v* S; R7 M7 W  C$ R( P+ z8 y2 |$ f1 U- H
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 D. @9 m, W- t# v7 B& b7 e* o
5 i/ ^  G, R& y0 V" s4 \        if(pshreRAM->packet_cout != count_copy)3 X! {0 z; j  W* d% X
        {. g) l7 x$ R7 E- H9 M! z' e
                printf("a is %d\n", pshreRAM->a);6 q- r3 A6 A. e3 o9 i. [
                printf("b is %d\n", pshreRAM->b);
. h7 q* e3 I, s+ b                printf("count is %d\n", pshreRAM->packet_cout);
3 t3 X6 b; u: [" x$ @9 @                count_copy = pshreRAM->packet_cout;
5 W3 E0 N) c* K        }+ @' o  C1 O' T7 W
        else
7 B$ i7 N3 b. s' n. L  ?; s        {
: J- M# V) x9 j1 Z0 ?" D1 x3 N                printf("No effective message!\n");+ @8 z7 Q1 o& A( E$ t
        }: j0 Y1 S4 t3 J# c. Q
}) I" k  y# c3 z% V

" f6 B6 p5 y) y1 i1 g: C没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 `# g& c2 S9 N+ \: G0 g: Y# n
  \+ a) @$ M% Z" D$ P; P
9 M" [6 d$ a* o* l

% {5 a- L$ S( D6 j: @
  h; }! {) |8 V9 n* i& b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-1 16:17 , Processed in 0.040315 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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