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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' l8 `& v9 L. k0 K, m
" {  N% M& b5 A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' {3 D3 C1 ]4 I6 t! m
#include <unistd.h>0 X: I; ^# {" u+ @6 A3 C0 P; Z
#include <sys/mman.h>
* c4 f8 h, ~$ f8 u: ~#include <sys/types.h>
# U# o1 p0 N% w7 ?8 f#include <fcntl.h>
- C: V2 V- A. O* X8 U" v5 D, z# |- B/ z5 U+ C4 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   4 e) u8 t2 m7 d* H1 r9 C

, t$ U4 U- r! I& R( n( gtypedef struct1 c- Z  E5 x: B; S) G. ^8 i
{/ p/ Q  X5 V- x* i
        unsigned int a;
+ f5 o9 C8 c8 b2 i5 O0 ?  y3 `; @        unsigned int b;2 W. u2 z1 O# e' P' m! _
        unsigned int packet_cout;
1 \- D0 d. u- N; G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* h. p. v3 j3 B  b! m8 X  |) s# i. t$ F7 N5 j" q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 _6 i! Y  \! e% V
unsigned int count_copy = 0;( S* z2 T/ f2 s; t% @  H

% G) j0 H2 l5 L$ C) g* l: c
' f) W5 b: ~4 fint main()6 _* p/ r( C, ]& ~% `  c
{8 r( k/ h5 G# c( @( G# K3 a# @5 K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 b1 \: G  Z$ x$ x2 t        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; C5 H: {0 {" g$ h

% a* e1 `' A8 t7 C& ?! ~        while(1)
% E. k$ [4 L+ G* w; R: V$ N        {
$ ?1 W& `' Z! M7 S' j* }                read_MSG_buffer(pshreRAM);
0 b/ Y6 d* D8 c/ e: G, w. l4 f        }                + [5 H" G6 z/ m5 _
}
0 S( X8 r/ @$ F6 A/ }
6 q7 D8 X3 K" ]* S# q7 y. i7 ]( pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& w; v/ ^" {6 ?5 z6 w
{
. [7 n2 V: H4 Q2 i, ^9 _  Q        RX_MSG_PROTOCOL buf;
' `# f6 d- G; [  g' Z5 K: B        
3 l4 p$ A5 \2 T1 H. c        buf.a = pshreRAM->a;
( n! Z, B( p4 c6 L: k& z; R        buf.b = pshreRAM->b;
- t9 L+ Y6 j& e( k' n9 t        buf.packet_cout = pshreRAM->packet_cout;
6 Y1 J* T7 A( P, g1 F* r        * p5 B) l8 X6 {) h1 R# Q
        if(buf.packet_cout != count_copy)* n0 ]$ u2 o& @) f- C. T. l& |, }
        {6 }& M+ H1 j& E0 W. R, N# [
                printf("a is %d\n", buf.a);" {" m5 a" s1 b  K7 V& ]4 f
                printf("b is %d\n", buf.b);) T: h  S4 z+ M' q9 r/ B3 h
                printf("count is %d\n", buf.packet_cout);
& U% h8 V4 A4 K8 r                count_copy = buf.packet_cout;
( k, o& W+ j/ ~1 J4 i9 B        }7 z( _7 R* N0 s" Q$ g) ~2 Y
        else1 l. M4 T  c/ g9 \
        {+ v" j0 S, H* l1 a
                printf("No effective message!");  F" l7 l" G' I' c6 s, q5 e+ U- T
        }
, M( [+ @4 E8 I; p- N3 ~) r8 O}+ ^7 d# R( L, Q, a) `( C# B' ^

* c9 f1 z7 k6 c: [! Z
# O& Y3 K0 |2 K' t但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# O) c- ^( }1 |0 i! F
使用下面代码,对内存使用了mmap函数后:
+ l6 V; K8 F1 u4 q9 P( M#include <stdio.h>
2 m- \3 H7 C/ W/ g3 Q#include <unistd.h>" Z$ ^& H- K* r5 Y! O
#include <sys/mman.h>8 a) J, u. f7 C
#include <sys/types.h>/ ]# f2 g  |/ D+ F; M. e; g
#include <fcntl.h>  o. B' S! }/ ]9 E

0 \4 @  O# q5 ?* A- N#define SHAER_RAM_BASE_ADDR    (0x80000000): L$ Z& R$ Z: y8 Y
#define SHAER_RAM_SIZE         (0x20000)   . F3 K; m% m8 v; h  R) p+ e9 V

" @) l' K; }" ?6 v$ U+ D% r3 Ctypedef struct
5 k/ K. Z0 n; [" k0 d5 @{
- e6 v/ n! k* s0 Y3 h: p        unsigned int a;
+ C' M+ }. I5 u+ X8 O        unsigned int b;
: z; h1 E) y) X( Z# t        unsigned int packet_cout;
7 p! U5 U6 r# M3 U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 H  a; P4 E& _, l+ ]

& ~7 L( F. s- q" `! Rvoid read_MSG_buffer(int *baseaddr);' D' S5 G& x' e% U3 G' k7 Y. p% W1 b: \
unsigned int count_copy = 0;8 C$ A- j" S$ W! }# D
$ w; H& _) N8 I6 ]* l# N4 e) ~
int main()
" m& o9 L, y) ^+ }7 U# t{
$ ?6 c( J. |* l5 {        int fd;" v* T  n% N; Q% z1 ]
        int *mem = NULL;
$ L0 [7 ~5 l' K& u" C1 N
+ I* I( t" {) G, a8 i        if((fd = open("/dev/mem", O_RDWR)) <0); g: e) z3 v' E# [6 K
        {
* v& c+ t3 K& ~! ]% `9 D- a2 N                perror("open error");- r9 H2 r8 p0 D" e( W
                return -1;* h3 i# b+ \3 d1 O" n% I- E- @
        }. |/ I' n. v2 q  u% L& q; Z: A# A
        
; k  {. W3 s0 {" g        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ \( u# K; R* X6 R. ?. D; H( j2 \* G& ~
        while(1)! X9 t% P4 \% f" |
        {$ _' l' l5 r! \5 [
                read_MSG_buffer(mem);
, }; `/ t# `! u        }                & \& |6 r' r7 v! y* u( T6 J
}
' A, N  g, J7 y1 I( U1 z, I- r1 O& `) n; _9 J$ h3 I7 ~
void read_MSG_buffer(int *baseaddr)0 g) _3 Z' T1 L, b' G
{6 F' l- Q4 E3 S& ]0 `
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 q7 x. U' K  F
5 [1 L! K' U) A' c8 I6 o
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* W) u2 U" x) y$ M! j0 z$ q
- M& q' c' x* n1 I* N. ?
        if(pshreRAM->packet_cout != count_copy)6 _7 d3 |8 {  w7 C9 p
        {
; _" G2 ^) R- K4 ^& E0 Q9 ]                printf("a is %d\n", pshreRAM->a);
8 i, p+ ?* T. O6 G                printf("b is %d\n", pshreRAM->b);- k! i5 _) f- M2 G
                printf("count is %d\n", pshreRAM->packet_cout);: |9 v# H: \+ K$ [$ }7 J" s( u, F
                count_copy = pshreRAM->packet_cout;
' n8 E8 d- \# A! w9 v/ Y. l7 b        }
6 F8 Y. K$ D% p1 a3 L3 x: Z        else1 L" M1 C7 G; ^, A' i$ j
        {1 N% L) J9 D; T# }
                printf("No effective message!\n");
% F9 E6 X' f2 k# ]5 z        }
5 M1 l* b+ U4 T# I* Y}
3 ?; [! r  m. E' e$ b8 ]0 |& t
' y# N4 R2 q, ~8 Z2 M9 e( V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* o% B& g, M5 n: {
/ n, n9 r) r( O( c7 l
: U  H1 i0 B- W# s; e
6 v, b$ }' ?! a% R
) ~* S1 H+ Z; D; o/ H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-22 22:04 , Processed in 0.040375 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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