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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 J8 J9 S& V2 |; c( w
* w+ ~- ~1 x' N" a0 p/ n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 e$ n) b" W  z. |+ F#include <unistd.h>
- E. Y: @6 N$ N* N( j: h5 J#include <sys/mman.h>
! @& ~" r$ [1 k; Y#include <sys/types.h>; b1 o9 h8 `: H' q! ?
#include <fcntl.h>
% {. H0 T, v: V. s5 [. g1 i, y# h
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ r7 I2 N$ E- \* R) L  ?9 J+ ~' @  j! ^8 Z
typedef struct
* w2 r, }# `" h; {/ h{4 }. l) z. x, P' U
        unsigned int a;& K/ `0 B& @/ d. L5 u' [9 X
        unsigned int b;
/ Z5 Q! e$ s/ R0 Q' B6 A        unsigned int packet_cout;- B2 c) M* `# ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 S& p/ f6 r7 ~' ]/ v% v9 x6 e

/ `$ h$ j# R7 z7 `) J* T# Z2 ^- D2 lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  g9 V9 W- F  d2 E: Q' F. D
unsigned int count_copy = 0;
7 k4 K" v0 T8 h, A) G, }0 q
1 e5 T) ?# g1 _* X6 b$ Z1 J) M- ^4 W0 O. v  `5 o
int main(). U; e6 X# D/ Z# h
{/ e$ [+ g8 _" u6 k. C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: k: y3 W, N$ x8 W. Z/ V        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 y* z) [$ T3 x- [7 D
  u5 U" Y$ k' F  \2 f
        while(1)3 k& Y, v  h8 b$ E. p8 [3 P0 @
        {
$ {/ r5 _+ W3 a- v0 @- D* z                read_MSG_buffer(pshreRAM);
0 i+ j6 Z& P4 G        }               
4 V: ~) j* g, F( Z( \}
( O9 H  @2 _" r$ Z* G1 A, x! m2 N: f/ X/ J* o, |5 B) N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 a& ?- N4 }9 @# H+ F
{
8 H3 d3 Y$ \4 B9 Q: e        RX_MSG_PROTOCOL buf;
- n6 W8 y* T: d4 x% ~$ N        ; v2 N3 Y- h8 T. [% \; `, T
        buf.a = pshreRAM->a;! A+ k( `4 Y2 X
        buf.b = pshreRAM->b;
& G8 T/ f7 a2 ]/ ]        buf.packet_cout = pshreRAM->packet_cout;4 Y. P, w* J. ~/ e/ }3 G  j# c, Z. z" |
        " T  ^2 w3 V, G3 Q) v
        if(buf.packet_cout != count_copy)9 E) N: {# O8 q( O, H8 ^( ?
        {; r+ s' ^7 P7 Z1 T3 H4 S2 C& |
                printf("a is %d\n", buf.a);
3 I+ v. P7 u5 T) c" s5 m9 s6 h                printf("b is %d\n", buf.b);/ H0 D) ?$ Y5 Y
                printf("count is %d\n", buf.packet_cout);
) g: U6 W3 k1 @, e                count_copy = buf.packet_cout;
* |% v/ v& Y& _: f) o" d! Y5 z        }" K# G, f  T4 f) G7 \" J7 D
        else
; i- G$ I( [6 }0 c/ x        {3 c( }/ M6 ]# N( V1 H* K8 Q
                printf("No effective message!");
" S# m7 D& H% I2 _' g, r7 ~. X        }9 |0 g$ T! ?4 V1 e3 Q
}
1 U& k' @1 m% g0 t4 o* g6 V% d" I$ b% s) p8 I, d6 a" z$ X4 b. ?4 ~
5 T3 |) f+ e: {& N3 r; v1 F
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# ?3 o' z: z( g1 W" o$ l* p0 a
使用下面代码,对内存使用了mmap函数后:
; @' n, e: J$ K- y" S& h6 V#include <stdio.h>9 ^6 g9 n+ Y, L# t6 M9 v* T
#include <unistd.h>5 T" b% C, l: u* n* |; T
#include <sys/mman.h>
: C6 @/ L- G9 J  t* f/ G+ m7 N1 u#include <sys/types.h>
3 A3 ?9 R2 z% L6 N2 W& G#include <fcntl.h>: H5 k! q3 A; S  D" K

; x( Q* x6 W& {: V! ]0 Z3 D#define SHAER_RAM_BASE_ADDR    (0x80000000)9 ]! p$ J0 s4 {0 E0 T3 g
#define SHAER_RAM_SIZE         (0x20000)   . G# Q. V+ R, R/ l  b/ R& }
6 I0 w% M5 j9 f0 z. U+ m
typedef struct0 P" u( g/ V8 O' o
{# H9 ?. b: a7 a8 `( G! T' l
        unsigned int a;
/ g. h" [+ Z& G5 @  Y+ `& M. G        unsigned int b;# t6 L3 E$ x: C* k  s! Y  q9 W
        unsigned int packet_cout;
6 w, T$ z; V: o. O5 M0 l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' o& Z/ f9 y; z% {3 E9 T- n% R3 w, b: ?% T0 K, s3 ~
void read_MSG_buffer(int *baseaddr);
  U9 t3 Q9 u8 Kunsigned int count_copy = 0;
* E; K; e! W! K+ W/ x4 T5 C+ E9 M) I0 G1 p! X4 i
int main()8 z+ O+ r  L' g2 W9 ]
{( p# J* Y. n) F' N" g
        int fd;# }  c' a% ]' [. h! V' S
        int *mem = NULL;, B# b: A0 z1 s( [# E
4 G; ~$ D- H( U4 {
        if((fd = open("/dev/mem", O_RDWR)) <0)& U4 \/ P* J9 p; P7 D# F
        {
8 p# y& j2 R& ]8 e7 R$ _                perror("open error");
5 p; ^$ Y" h( }                return -1;8 _0 f# L0 W+ p/ F! [% V
        }
  c0 P+ p. G. J% ~( d' @: ]# a- c        2 {3 x3 I0 x/ s. K0 l3 L+ z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' f8 q7 r9 G1 n* q+ V
8 f, y' {" ?0 J' e6 \: m0 M        while(1)$ {& h, {8 |- A- @$ N
        {4 t/ ]: ^  j/ F
                read_MSG_buffer(mem);( n8 _1 M- r( p* H" r5 l. L7 m( K3 l4 Y
        }               
( o  C- l4 P4 U}/ R6 T$ d' `; Q, M: f
3 y9 l/ X/ ~/ e
void read_MSG_buffer(int *baseaddr)" M4 [% Q& j, d1 H3 C
{' \2 x- V6 k5 H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 E' a+ O; \7 {- }/ f/ f( W( Z, m+ r7 m3 z$ n( A! m4 [5 W) `
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ P- g" j) h: ]7 `0 x, L. }, E
( n+ _1 N8 v- L; \$ h
        if(pshreRAM->packet_cout != count_copy), d3 N2 v% o+ a! S  a: z3 Z
        {. u3 \& t, C( L% T* b3 @0 l0 N
                printf("a is %d\n", pshreRAM->a);
* L4 z7 w: h* {9 C6 o4 Z3 W- k                printf("b is %d\n", pshreRAM->b);- ]3 s* {0 f( O1 B5 G8 y
                printf("count is %d\n", pshreRAM->packet_cout);/ o5 J* p, F1 W* i) ?' A$ ~& B
                count_copy = pshreRAM->packet_cout;
9 W' S2 ^: n# h5 }, h        }. q) t9 O. v& s
        else4 V& y) e" ?3 ~% A6 T7 _
        {) Y" l" `1 _1 n0 M0 X9 @
                printf("No effective message!\n");
/ y. k' g# F. t        }% m7 \% _8 E( A
}
9 Q( |) G$ Y- x" {
1 K/ [  |3 h* _% S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 d- B! r: I; w" O: ~

. s/ p' c0 I. H/ N( [& `! V" b$ _  T4 i2 K; g
$ n( {9 H# ]( U4 g  ^6 q- D

  ~" O) F5 x! z$ m& O  l  u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-12 11:51 , Processed in 0.037522 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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