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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 u9 L  ~' A% \7 e3 e2 J/ R  r- @$ s+ P) _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 p7 ?: E  ^! c# @) m
#include <unistd.h>  F( l# Q4 T  l- v, @
#include <sys/mman.h>
# E/ S6 X  }; c% j#include <sys/types.h>* P. d" p  W. A
#include <fcntl.h>9 G. W) z6 }; m! g

7 N. L; K! x+ J4 @9 A* t* U#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' b, T2 B' n: l' n, o( j
8 e+ n) _" }( ]# k" L7 P
typedef struct
* D/ z% t4 N' u( B* t5 [9 \{
/ \$ P' S) B3 T/ d) _3 i4 I        unsigned int a;
" ?8 p& {$ }+ o7 y* I, ^) N        unsigned int b;8 o4 c1 [# v: i5 M( Z0 l  N( t
        unsigned int packet_cout;4 c: F" h; i" n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ _! y) Y* T# k2 ?( r! _
) g4 N$ Q5 Q8 I1 {5 Y! x7 w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! @8 A" |0 e  M# Y" P$ n
unsigned int count_copy = 0;
9 f$ S' y% \; ~$ |0 U
; {' n( t# A7 G3 {2 A% \& [" B" ^# x' q( z' r1 r8 q
int main()6 \; I  Y3 w2 r" j) T5 F
{
: r- G) c4 @, ~0 }. ^3 t# s        pRX_MSG_PROTOCOL pshreRAM = NULL;3 I4 L2 D& q0 f4 ^6 D1 K- w
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ ^1 J0 _! o" J# l# j' Y  D5 N  Q4 @; l- [( a
        while(1)
3 m  E/ B  U7 A3 J! b0 a        {
# y0 }' ~% b* r2 C                read_MSG_buffer(pshreRAM);
6 g* _0 R2 m: g: N        }               
* g4 l  b9 r9 N9 R* B! C4 j}1 {9 x/ Z' @" ?# m! N6 E1 ^: @" d9 }3 X
  b% X0 f! p5 p/ z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). ?1 g7 u# c* e! T
{; N) ]1 P0 d9 x- q* U1 W
        RX_MSG_PROTOCOL buf;9 l. j+ m  i0 d8 o9 x5 i
        ! X/ c4 A) b) A' ~1 \4 e
        buf.a = pshreRAM->a;
/ Y. O0 X: n4 l) v        buf.b = pshreRAM->b;
$ t0 Z) }' Y; H6 G/ |' f% I/ k3 b/ {        buf.packet_cout = pshreRAM->packet_cout;9 U' x5 f+ S0 R6 r# M7 Z
        
5 }5 B5 V) M( g! g/ `3 z        if(buf.packet_cout != count_copy)2 \  ^+ d3 O! _# @' r& l- m$ ?
        {& k$ Y* d! ~: _
                printf("a is %d\n", buf.a);' t5 b) X& A3 Y& E. g
                printf("b is %d\n", buf.b);
6 j) J" G2 O2 K9 Z& z; j, L                printf("count is %d\n", buf.packet_cout);
) `$ R& c! n8 P) F% v                count_copy = buf.packet_cout;
- e6 ], X9 D+ Z7 ?. o' ^        }" o6 c  o  g. z6 v/ z
        else
" A, `* Y9 P+ l6 k- M( _! {$ g        {
; x2 E  _7 k7 W  J* X5 K% Q, b: h% ~                printf("No effective message!");
! c# ]" s$ y/ E( _        }
  |6 k  j6 Q" {}
* ^7 [5 |. v& R, g6 O7 e
$ _4 d5 g+ v- z# ?- @% Z: ~8 M6 y9 c" r4 ?9 _$ `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ W5 ~. `1 f% s% V% D" }. T* ~使用下面代码,对内存使用了mmap函数后:
) o" S' x: V$ W" H#include <stdio.h>
' O3 G& H9 D9 u* N  y#include <unistd.h>2 \$ I9 ~4 u& n4 E- Y$ X$ T
#include <sys/mman.h>" ^' |4 }5 C3 d
#include <sys/types.h>. @9 H2 |; |* s0 G  j3 T! d
#include <fcntl.h>
0 F+ A7 i  i  V% ]0 i6 k
/ c  O/ S( S/ I#define SHAER_RAM_BASE_ADDR    (0x80000000)9 V. i, Z) v  I) m3 j! \4 {: Y
#define SHAER_RAM_SIZE         (0x20000)   
' q. N1 J9 e- P$ \1 p- `* X; O* R% v0 x" q
typedef struct# X: b& C8 O; ~+ n5 P
{/ E6 J2 G) ?& f9 s: ]3 z3 G
        unsigned int a;
2 m9 t7 P: T' F# N: B        unsigned int b;
7 [$ u( v, R2 G8 @+ A& `" f        unsigned int packet_cout;
; n- X8 G* E/ Q9 p# `7 A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 R0 E5 t+ W- G$ k8 s+ w. @& J" y4 t3 A' o
void read_MSG_buffer(int *baseaddr);. X5 N& |4 \3 @$ ~9 u0 [
unsigned int count_copy = 0;
/ R3 J$ A! G$ U. K' w2 [* X/ C" b* ^+ J; s+ W# z2 g
int main(), U, L' @* e3 ^" b8 @4 Y4 Y
{2 D& [) |9 r$ S2 d( \5 q% T+ @
        int fd;
  R9 N; L7 Q9 Z! b9 ?        int *mem = NULL;3 L5 Q0 t" `* z: @6 {
4 t' C6 p, K# I: u4 K$ g5 y
        if((fd = open("/dev/mem", O_RDWR)) <0)$ V% m+ w: z" V! Z* t7 h
        {# o3 q* F- ?5 c
                perror("open error");* G! s. x2 p4 {& D
                return -1;
% @  w6 X3 F" j6 T$ d$ N        }8 w; J% ~4 Y  _8 d
        
4 `  [- O3 s$ Y' v1 n6 m& |, e        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- B+ t1 X  {3 l. n& m4 T

( x! J5 w  g3 A5 @        while(1)
0 m% ]8 S" P6 a8 h. ?4 U        {
: S) w+ Z: e4 t2 c                read_MSG_buffer(mem);, |4 f* t8 B6 n9 U" v. P
        }               
8 w# l' A9 O# m9 p}
) n: _4 z5 K9 e. \0 o* E* I
' k) G4 x" N4 V+ Q& Lvoid read_MSG_buffer(int *baseaddr)
" ~0 m# l5 j( ^{
8 v: K- b. l/ A, G0 P% _% A        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 \6 s+ c/ g9 o# Q+ K/ w7 ?2 k
8 P- T3 G3 ~. f( v        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# p6 g* j# L- T! x

- r6 F5 i4 I0 _8 s8 d! m        if(pshreRAM->packet_cout != count_copy). {# S* U, s& h+ I: M% H3 P
        {
% K, r3 w3 |% k+ z                printf("a is %d\n", pshreRAM->a);! G: S! `2 \9 B, r
                printf("b is %d\n", pshreRAM->b);2 [& j; t0 N! t- H5 e& A
                printf("count is %d\n", pshreRAM->packet_cout);
; l% C; R6 S1 U* q' ^                count_copy = pshreRAM->packet_cout;/ S" O* M3 x8 `' p  Y" S, v
        }
/ X; M& L' X+ s) h        else, C" c, ]" I) \* v" [7 i9 Y
        {' B, B( O- ~8 m7 [3 [
                printf("No effective message!\n");2 ~& R9 [* w' e" Z/ c5 P( F2 a
        }
7 ]5 w6 f6 x2 Y7 L& X}' v, v+ t' x) u) M7 G- x9 i% U

2 o! z" \# j$ \$ ]3 b. t9 R! y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- N) C" Q+ A& r: n( q9 f  d1 R' J' s9 {& \

' y7 H4 L- f, L! B2 a; U4 J( a$ n; p5 p9 K5 k, A, L5 E  }$ t
) b7 E: c6 Z  l9 s1 m1 @1 p# d  C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-6 18:01 , Processed in 0.039782 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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